我需要通过@Autowired注入服务类的具体实现。
服务界面:
public interface PostService {
...
}
实现:
@Service("postServiceImpl")
public class PostServiceImpl implements PostService {
...
}
服务中的方法使用@Transactional annotation
现在我想将postServiceImpl注入我的控制器 - 因为我需要使用实现中的一个方法,而不是在接口中:
@Autowired
@Qualifier("postServiceImpl")
private PostServiceImpl postService;
我使用以下消息获得 NoSuchBeanDefinitionException :
找不到类型为[(...).PostServiceImpl]的限定bean 依赖:预计至少有1个bean有资格成为autowire 这种依赖的候选人。
当我将控制器中的字段更改为:
private PostService postService
它有效,但我不能使用PostServiceImpl中的特定方法。
答案 0 :(得分:10)
由于您的方法已注释@Transactional
,因此spring将在运行时创建代理,以注入事务管理代码。默认情况下,Spring使用 JDK动态代理代理机制,代理基于接口。
因此,在这种情况下,spring创建另一个实现PostService
接口的类,并创建该类的bean。绝对不能自动连接到PostServiceImpl
,因为那些是兄弟姐妹。但是,如果你真的想在类上自动装配,你可以强制spring使用 CGLib 代理,代理使用子类。如果您使用的是基于Java的配置,可以在proxyTargetClass=true
注释中设置@EnableTransactionManagement
。