接口与Spring自动注入

接口与自动注入

有业务接口 IService 和两种业务逻辑的实现 Aservice, Bservice 如下:

public interface IService {}

@Component
public class Aservice implements IService {}

@Component
public class Bservice implements IService {}

采用下面的方式自动注入时,会报错:

public class ManageService {
    @Autowired
    private Aservice aservice;

    @Autowired
    private Bservice bservice;

    // ...
}

异常信息类似为:nested exception is java.lang.IllegalArgumentException: Can not set xxx.ManageService field xxx.ManageService.aservice to com.sun.proxy.$Proxy48

这是因为,Spring 管理的 Bean,如果这个 Bean 实现了某个接口,那么就用 JDK 的 Proxy 动态代理机制来生成代理对象,而不是通过 cglib 子类化出一个代理对象。

这时,对于 IService、 Aservice 类的层次结构如下,

    IService
    ^       ^
    |       |
Aservice    $Proxy48

即两个代理对象都实现了接口类,但却是不同的类型,因此注入失败。

可以 Qualifer 来实现自动注入,注意属性的类型是接口类:

public class ManageService {
    @Autowired
    @Qualifier("aservice")
    private IService aservice;

    @Autowired
    @Qualifier("bservice")
    private ISservice bservice;

    // ...
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据