最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
spring解決循環(huán)依賴的方法

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

目前成都創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、濟源網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(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會調(diào)用getSingleton先去從一級緩存singletonObjects中拿,如果一級緩存沒有,則去二級緩存earlySingletonObjects中拿,二級緩存中沒有,則去三級緩存singletonFactories中拿,如果都沒有,則調(diào)用createBean方法開始創(chuàng)建這個ClassB這個Bean。
spring解決循環(huán)依賴的方法
        接著createbean會調(diào)用doCreateBean方法,這個真正執(zhí)行創(chuàng)建bean的方法。該方法調(diào)用createBeanInstance(beanName, mbd, args)通過后置處理器判斷調(diào)用ClassB的構(gòu)造方法并創(chuàng)建返回ClassB的實例對象,此時對象的ClassA的引用肯定是空,因為ClassB的默認構(gòu)造方法,并沒有對ClassA賦值。接著spring會將這個早期對象放入三級緩存singletonFactories中。
spring解決循環(huán)依賴的方法
       進入resolveReference方法,spring會先去判斷當前容器是否有父容器,如果有則從父容器中獲取引用對象ClassA,如果沒有則從當前容器中獲取引用對象ClassA。(spring允許子容器使用父容器的bean,就是在這里體現(xiàn)出來,比如springmvc)這時候程序會調(diào)用this.beanFactory.getBean(resolvedName)。從容器中再次獲取ClassA這個引用對象。此時getBean會調(diào)用doGetBean從新走剛才創(chuàng)建ClassB對象流程。

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

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

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


網(wǎng)頁標題:spring解決循環(huán)依賴的方法
分享網(wǎng)址:http://fisionsoft.com.cn/article/gepejj.html