1、背景
在写代码时,发现service接口有两个实现类,并且两个实现类中没有对类名重命名,属性注入的时候也没有使用byName或@Qualifier,正确情况下会发生多实现报错的问题,以前对这个问题进行解析过。
2、调试过程
我想通过直接从IOC容器获取接口类型的实现类,看看有几个所以添加了如下代码,发现只有一个实现类,查看没有注入的类发现是抽象类。
3、结论
通过查阅,类扫描加载部分代码,发现ClassPathScanningCandidateComponentProvider类中findCandidateComponents方法。如果是抽象类的话,类中方法上有@Lookup注解才能被注入ioc容器,注解只能使用在方法上,在方法上加入注解后,重新启动,果然报错了,说明此抽象方法被注入Ioc容器,有兴趣的朋友可以打断点看看ClassPathScanningCandidateComponentProvider在什么时候创建,findCandidateComponents什么时候调用的。