真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

spring解決循環(huán)依賴的方法

本篇內容介紹了“spring解決循環(huán)依賴的方法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

目前成都創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網站建設、域名、網絡空間、成都網站托管、企業(yè)網站設計、濟源網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。


    首先看下spring創(chuàng)建一個bean的簡單流程,假如beanA引用beanB,beanB引用beanA,spring在初始化beanA的時候會造成循環(huán)依賴(這里講的是單例,spring底層只對單例循環(huán)依賴進行解決)。
spring解決循環(huán)依賴的方法
       在記錄之前我寫了兩個測試類進還原循環(huán)依賴,一個是ClassA,里面的引用了ClassB,同時ClassB也引用了ClassA。這樣子ClassA和ClassB形成了循環(huán)依賴。
spring解決循環(huán)依賴的方法
         spring容器底層在創(chuàng)建ClassB Bean會調用getSingleton先去從一級緩存singletonObjects中拿,如果一級緩存沒有,則去二級緩存earlySingletonObjects中拿,二級緩存中沒有,則去三級緩存singletonFactories中拿,如果都沒有,則調用createBean方法開始創(chuàng)建這個ClassB這個Bean。
spring解決循環(huán)依賴的方法
        接著createbean會調用doCreateBean方法,這個真正執(zhí)行創(chuàng)建bean的方法。該方法調用createBeanInstance(beanName, mbd, args)通過后置處理器判斷調用ClassB的構造方法并創(chuàng)建返回ClassB的實例對象,此時對象的ClassA的引用肯定是空,因為ClassB的默認構造方法,并沒有對ClassA賦值。接著spring會將這個早期對象放入三級緩存singletonFactories中。
spring解決循環(huán)依賴的方法
       進入resolveReference方法,spring會先去判斷當前容器是否有父容器,如果有則從父容器中獲取引用對象ClassA,如果沒有則從當前容器中獲取引用對象ClassA。(spring允許子容器使用父容器的bean,就是在這里體現(xiàn)出來,比如springmvc)這時候程序會調用this.beanFactory.getBean(resolvedName)。從容器中再次獲取ClassA這個引用對象。此時getBean會調用doGetBean從新走剛才創(chuàng)建ClassB對象流程。

spring解決循環(huán)依賴的方法
      同樣spring在創(chuàng)建ClassB的引用對象ClassA時,也會去解析ClassA的引用對象。此時ClassA的引用對象是ClassB(此時ClassB對象是暴露在三級緩存中的),這是時候通用調用當前容器的getBean--->doGetBean,在doGetBean中調用getSingleton(beanName)方法。在這里我們會看到spring在從二級或三級緩存中獲取對象是有條件的,條件即使這個對象正在創(chuàng)建中。通過isSingletonCurrentlyInCreation(beanName)這個方法去判斷的。
spring解決循環(huán)依賴的方法
      此時ClassA對象ClassB的引用已經拿到值了,所以創(chuàng)建一直往下走,走到addSingleton(beanName, singletonObject)這個方法,將ClassA放入一級緩存singletonObjects,從二級緩存和三級緩存中移除。因為ClassA的bean已經創(chuàng)建完成了,二級緩存和三級緩存已經沒用了。此時完整的ClassA的bean返回出去,ClassB的屬性ClassA也得到了賦值,ClassB的bean可以繼續(xù)創(chuàng)建了。

     注意:spring在通過構造器給屬性賦值是無法解決循環(huán)依賴的,從上面分析來看spring執(zhí)行createBeanInstance方法去判斷調用當前bean的構造方法,此時還未放入三級緩存中。如果是bean作用域是原型也是無法解決循環(huán)依賴,因為原型對象并沒有放在緩存中。

“spring解決循環(huán)依賴的方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯(lián)網站,小編將為大家輸出更多高質量的實用文章!


網頁名稱:spring解決循環(huán)依賴的方法
分享鏈接:http://weahome.cn/article/gepejj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部