spring處理對象相互依賴注入的問題


最近重新再看spring的內容的時候有個疑問:當spring對象對象存在相互依賴注入的時候,會不會造成死循環,如果不會spring是怎么解決的?帶着這個疑問我自己在eclipse試了一下,發現是能正常運行的,那么spring是怎么做到的呢,帶着疑問我百度了一下,查到一篇博客可供大家參考:https://blog.csdn.net/u012410733/article/details/61062858。但是這篇博客並不能完全解決的疑問,於是我又把問題發給了線上培訓的導師和培訓的會員群上,經過老師的解讀加上我查閱資料,做出以下總結:

一、Spring 循環依賴需要滿足三個條件:

1、setter 注入(構造器注入不能循環依賴)
2、singleton bean(非單例 bean 不支持)
3、AbstractAutowireCapableBeanFactory#allowCircularReferences 這個 boolean 屬性控制是否可以循環,默認為 true。

二、Spring 創建對象分為三個過程:

1、創建對象實例 Object obj = new Object() 或者 Object obj = new Object(xxx);
AbstractAutowireCapableBeanFactory#createBeanInstance
2、依賴注入: obj.setXxx(xxx) {多個屬性就是 foreach}
AbstractAutowireCapableBeanFactory#populateBean
3、Spring bean 擴展方法:init-method,BeanPostProcess,XXXAware 擴展
AbstractAutowireCapableBeanFactory#initializeBean
這里寫圖片描述
實現原理:
這里寫圖片描述

我們知道在循環依賴當中其實就是多個 bean 調用 BeanFactory#getBean
具體實現在 org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
而這個方在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean 方法前。
首先來看一下 AbstractBeanFactory#doGetBean
這里寫圖片描述
在進入 doGetBean 方法時就會從緩存里面拿 beanName 對應的對象。
這里寫圖片描述
其實中就包含創建的 ObjectFactory

總結

相互依賴:A 依賴 B, B 依賴 A
當 A 創建的時候,會把 A 對應的 ObjectFactory 放在緩存中,當依賴注入的時候發現了 B 對象,調用 getBean() 方法獲取 B 對象, 然后創建 B 對象,會把 B 對應的 ObjectFactory 放在緩存中。
此時 B 依賴 A ,然后再調用 getBean 獲取 A 對象, 此時調用 AbstractBeanFactory#doGetBean 從緩存中獲取到 A 對應的 ObjectFactory。
這樣就避免了死循環,然后再創建成功之后刪除 ObjectFactory 完成依賴注入。
思路:中間對象去解決循環依賴。


免責聲明!

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



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