我需要通过 @Autowired 注入服务类的具体实现。
服务接口:
public interface PostService {
...
}
执行:
@Service("postServiceImpl")
public class PostServiceImpl implements PostService {
...
}
服务中的方法带有@Transactional注解
现在我想将 postServiceImpl 注入到我的控制器中 - 因为我需要使用实现中的一种方法,该方法不在接口中:
@Autowired
@Qualifier("postServiceImpl")
private PostServiceImpl postService;
I get NoSuchBeanDefinitionException并显示以下消息:
找不到 [ (...) .PostServiceImpl] 类型的合格 bean
依赖项:预计至少有 1 个符合自动装配资格的 bean
这种依赖性的候选者。
当我将控制器中的字段更改为:
private PostService postService
它有效,但我无法使用 PostServiceImpl 中的特定方法。
由于您的方法已注释@Transactional
,spring会在运行时创建代理,来注入事务管理代码。 Spring默认使用JDK动态代理对于代理机制,基于接口进行代理。
所以,在这种情况下,spring创建了另一个类来实现PostService
接口,并创建该类的 bean。绝对不能自动连接到PostServiceImpl
,因为他们是兄弟姐妹。然而,如果你真的想在课堂上自动装配,你可以强制 spring 使用CGLibproxy 而是使用子类化进行代理。你可以通过设置来做到这一点proxyTargetClass=true
在你的@EnableTransactionManagement
注释,如果您使用的是基于 Java 的配置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)