欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Spring中如何處理循環(huán)依賴問題

 更新時間:2025年01月07日 08:38:05   作者:MuseLss  
Spring解決循環(huán)依賴的關(guān)鍵在于提前曝光未完全創(chuàng)建的bean,在Spring中創(chuàng)建Bean分為實例化、屬性填充和初始化三步,循環(huán)依賴的解決思路是先創(chuàng)建A的bean實例,此時A是不完整的,用一個Map保存不完整的A,再創(chuàng)建B,B需要注入A

Spring如何處理循環(huán)依賴

解決的關(guān)鍵就在于提前曝光未完全創(chuàng)建的bean。

在Spring中創(chuàng)建Bean分為三步

  • 實例化,createBeanInstance,即new一個bean對象。
  • 屬性填充,populateBean,即往bean對象中set屬性值。
  • 初始化,initializeBean。

循環(huán)依賴的解決思路

  • 先創(chuàng)建A的bean實例,此時的A是不完整的,因為沒有屬性填充(即B依賴沒有注入),此時用一個Map保存不完整的A,
  • 再創(chuàng)建B,B需要注入A,所以可以從Map中得到不完整的A,此時B就完整了,然后A就可以注入B了。

在Spring中,只有同時滿足以下兩點才能解決循環(huán)依賴的問題。

1.依賴的bean必須都是單例。

  • 因為如果是原型模式的話是需要創(chuàng)建一個新的對象,創(chuàng)建A1的時候,需要創(chuàng)建A1的依賴B1
  • 那么在創(chuàng)建B1的時候,又需要創(chuàng)建B1的依賴A2,這樣就要創(chuàng)建B2,A3,B3……,進(jìn)入無限的創(chuàng)建對象的過程

2.依賴注入的方式,不能全是構(gòu)造函數(shù)注入。

  • 如果全是構(gòu)造函數(shù)注入,即A(B b) ,那么表明在創(chuàng)建A的Bean的實例的時候,就需要得到B,那么此時就要創(chuàng)建B的bean實例,但是B也是要在構(gòu)造函數(shù)中注入A,即B(A a),此時B需要在Map中找到不完整的A,但是發(fā)現(xiàn)找不到,因為A的Bean實體還沒創(chuàng)建完(還在等著B)。
  • 注意:Spring容器是按照字母的順序創(chuàng)建 Bean的,因此循環(huán)依賴中,字母排在前面的Bean不能采用構(gòu)造函數(shù)注入。

Sping解決循環(huán)依賴全流程

首先了解Spring bean相關(guān)的三個Map

  • singletonObject,存放所有創(chuàng)建完畢的單例bean(完整的bean,即已經(jīng)完成實例化并進(jìn)行屬性填充)。
  • earlySingletonObjects,存放僅完成實例化,但未進(jìn)行屬性填充和初始化的Bean。
  • singletonfactories,存放能創(chuàng)建Bean的工廠,通過這個工廠能獲得bean,延遲bean生成,工廠生成的bean會放到earlySingletonObjects中。

在實例化bean,Spring是不知道當(dāng)前bean有沒有循環(huán)依賴的,它會義無反顧的往singletonfactories中存放當(dāng)前bean的工廠,這個步驟就是提前曝光

然后開始屬性注入,此時bean A發(fā)現(xiàn)要注入bean B,所以請執(zhí)行g(shù)etBean(B)

  • 先去singletonObject里找有沒有,如果有則進(jìn)行返回
  • 如果沒有,則判斷Bean是否在創(chuàng)建中,如果不在創(chuàng)建中,則返回null
  • 如果在創(chuàng)建中,則去earlySingletonObjects找,如果有則進(jìn)行返回
  • 如果沒有,則去singletonfactories找到這個bean的工廠,通過工廠去創(chuàng)建bean,并存放到earlySingletonObjects中
  • 如果singletonfactories沒有找到bean的工廠就返回null
  • 如果返回null,說明bean還沒有創(chuàng)建,這個時候會先把這個bean標(biāo)記為創(chuàng)建中,再調(diào)用doCreateBean(即,實例化,屬性填充,初始化三個步驟)

此時就到了B這個bean屬性注入的步驟了,調(diào)用了getBean(A),A此時在singletonfactories中找到提前暴露的工廠的到了A,然后把A從singletonfactories中刪除,放到earlySingletonObjects中。

此時B屬性注入成功,然后進(jìn)行初始化,最后B存放到singletonObject中。

此時又回到了A注入B的地方,完成了對B的注入,然后A也從earlySingletonObjects刪除,存放到singletonObject中。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot如何配置嵌套map和list參數(shù)

    springboot如何配置嵌套map和list參數(shù)

    這篇文章主要介紹了springboot如何配置嵌套map和list參數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 淺析Java中的虛擬線程

    淺析Java中的虛擬線程

    在本篇文章中,小編將帶大家深入了解Java虛擬線程的原理、如何使用、使用的注意事項以及其他相似技術(shù)的差別,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • java外賣訂餐系統(tǒng)小項目

    java外賣訂餐系統(tǒng)小項目

    這篇文章主要為大家詳細(xì)介紹了java外賣訂餐系統(tǒng)小項目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 在SpringBoot中通過jasypt進(jìn)行加密解密的方法

    在SpringBoot中通過jasypt進(jìn)行加密解密的方法

    今天小編就為大家分享一篇關(guān)于在SpringBoot中通過jasypt進(jìn)行加密解密的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java中實現(xiàn)雙數(shù)組Trie樹實例

    Java中實現(xiàn)雙數(shù)組Trie樹實例

    這篇文章主要介紹了Java中實現(xiàn)雙數(shù)組Trie樹實例,雙數(shù)組Trie就是一種優(yōu)化了空間的Trie樹,本文給出了實現(xiàn)代碼、測試代碼和測試結(jié)果,需要的朋友可以參考下
    2015-01-01
  • 聊聊Arrays.deepToString()和Arrays.toString()的區(qū)別

    聊聊Arrays.deepToString()和Arrays.toString()的區(qū)別

    這篇文章主要介紹了聊聊Arrays.deepToString()和Arrays.toString()的區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java基本數(shù)據(jù)類型之間的相互轉(zhuǎn)換詳解

    Java基本數(shù)據(jù)類型之間的相互轉(zhuǎn)換詳解

    這篇文章主要講解Java中基本數(shù)據(jù)類型的轉(zhuǎn)換,數(shù)據(jù)之間相互轉(zhuǎn)換是經(jīng)常會用到的基礎(chǔ)操作,文中講的很清晰,希望能給大家做一個參考。
    2022-05-05
  • 淺談Java注解和動態(tài)代理

    淺談Java注解和動態(tài)代理

    這篇文章主要介紹了Java中有關(guān)注解和動態(tài)代理的一些知識,涉及了Annotation、數(shù)據(jù)類型等相關(guān)內(nèi)容,需要的朋友可以參考下。
    2017-09-09
  • SpringBoot3 響應(yīng)式網(wǎng)絡(luò)請求客戶端的實現(xiàn)

    SpringBoot3 響應(yīng)式網(wǎng)絡(luò)請求客戶端的實現(xiàn)

    本文主要介紹了SpringBoot3 響應(yīng)式網(wǎng)絡(luò)請求客戶端的實現(xiàn),文章詳細(xì)闡述了如何使用SpringBoot3的網(wǎng)絡(luò)請求客戶端進(jìn)行HTTP請求和處理響應(yīng),并提供了示例代碼和說明,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • 使用@pathvariable與@requestparam碰到的一些問題及解決

    使用@pathvariable與@requestparam碰到的一些問題及解決

    這篇文章主要介紹了使用@pathvariable與@requestparam碰到的一些問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評論