接口与自动注入
有业务接口 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;
    // ...
}
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。
