Spring – 如何注入具体的接口实现?

我需要通过@Autowired注入服务类的具体实现。

服务界面:

public interface PostService { ... } 

执行:

 @Service("postServiceImpl") public class PostServiceImpl implements PostService { ... } 

服务中的方法使用@Transactional注释

现在我想将postServiceImpl注入我的控制器 – 因为我需要使用实现中的一个方法,而不是在接口中:

 @Autowired @Qualifier("postServiceImpl") private PostServiceImpl postService; 

我收到NoSuchBeanDefinitionException并带有以下消息:

没有为依赖项找到类型为[(…).PostServiceImpl]的限定bean:预期至少有1个bean符合此依赖项的autowire候选者。

当我将控制器中的字段更改为:

 private PostService postService 

它工作,但我不能使用PostServiceImpl中的特定方法。

由于您的方法是注释@Transactional ,因此spring将在运行时创建代理,以注入事务管理代码。 默认情况下,Spring使用JDK动态代理进行代理机制,代理基于接口。

因此,在这种情况下,spring创建另一个实现PostService接口的类,并创建该类的bean。 绝对不能自动连接到PostServiceImpl ,因为那些是兄弟姐妹。 但是,如果你真的想在类上自动assembly,你可以强制spring使用CGLib代理,代理使用子类。 如果您使用的是基于Java的配置,则可以通过在@EnableTransactionManagement注释中设置proxyTargetClass=true来实现。