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
来实现。