spring不能解決構造器循環依賴的原因


 
 
 

spring不能解決構造器循環依賴的原因

 

了解IOC流程

1.getBean -> 2.第一個getSingleton(在三級緩存取bean) -> 3.第二個getSingleton(去創造bean) -> 4.beforeSingletonCreation(向singletonsCurrentlyInCreation中添加正在創建的bean) -> 5.createBean -> 6.doCreateBean(從上至下調用的方法為:createBeanInstance,addSingletonFactory放入三級緩存中,populateBean填充屬性,initializeBean初始化bean) -> 7.放入單例池中

構造器循環依賴不能解決的原因

如果是構造器注入的話(假如有A、B類,A先B后),A第一次先把自己放入singletonsCurrentlyInCreation中,然后在createBeanInstance時會去調用@AutoWired標注的有參構造器(此時A沒有實例化,連對象都沒創建),然后會去getBean(B),這就回到了上方流程的開頭,B在第一個getSingleton沒有獲取到A,然后就去getBean(A),對於A來說已經是第二次了,於是在向singletonsCurrentlyInCreation添加的時候就會報錯,因為該集合已經有了A,因此異常在此處拋出。
如果是set注入,A在createBeanInstance時則會調用無參構造方法,在populateBean(此時A已經放入三級緩存了)時調用getBean(B),而B再去getBean(A)的時候(無論B是在@AutoWired標注的有參構造器還是無參構造去獲取A),直接就能從三級緩存中得到,解決循環依賴。

構造器循環依賴不一定不能解決

根據上文最后一句話可知,A先B后,A用set注入,B是構造器注入,這樣的循環依賴也是可以被解決的

參考文章

https://blog.csdn.net/CSDN_WYL2016/article/details/108125307
https://blog.csdn.net/csdn_wyl2016/article/details/108146174
https://cloud.tencent.com/developer/article/1749830


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM