1、背景
在寫代碼時,發現service接口有兩個實現類,并且兩個實現類中沒有對類名重命名,屬性注入的時候也沒有使用byName或@Qualifier,正確情況下會發生多實現報錯的問題,以前對這個問題進行解析過。
2、調試過程
我想通過直接從IOC容器獲取接口類型的實現類,看看有幾個所以添加了如下代碼,發現只有一個實現類,查看沒有注入的類發現是抽象類。
3、結論
通過查閱,類掃描加載部分代碼,發現ClassPathScanningCandidateComponentProvider類中findCandidateComponents方法。如果是抽象類的話,類中方法上有@Lookup注解才能被注入ioc容器,注解只能使用在方法上,在方法上加入注解后,重新啟動,果然報錯了,說明此抽象方法被注入Ioc容器,有興趣的朋友可以打斷點看看ClassPathScanningCandidateComponentProvider在什么時候創建,findCandidateComponents什么時候調用的。