接口与自动注入
有业务接口 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笔记,可以更及时回复你的讨论。