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

时间:2015-03-08 10:16:53

标签: java spring service dependency-injection autowired

我需要通过@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中的特定方法。

1 个答案:

答案 0 :(得分:10)

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

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