最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

  • 實(shí)例化,createBeanInstance,即new一個(gè)bean對(duì)象。
  • 屬性填充,populateBean,即往bean對(duì)象中set屬性值。
  • 初始化,initializeBean。

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

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

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

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

  • 因?yàn)槿绻窃湍J降脑捠切枰獎(jiǎng)?chuàng)建一個(gè)新的對(duì)象,創(chuàng)建A1的時(shí)候,需要?jiǎng)?chuàng)建A1的依賴B1
  • 那么在創(chuàng)建B1的時(shí)候,又需要?jiǎng)?chuàng)建B1的依賴A2,這樣就要?jiǎng)?chuàng)建B2,A3,B3……,進(jìn)入無限的創(chuàng)建對(duì)象的過程

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

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

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

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

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

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

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • SpringBatch從入門到精通之StepScope作用域和用法詳解

    SpringBatch從入門到精通之StepScope作用域和用法詳解

    這篇文章主要介紹了SpringBatch從入門到精通之StepScope作用域和用法詳解,主要包括IOC容器中幾種bean的作用范圍以及可能遇到的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • Java返回分頁結(jié)果集的封裝代碼實(shí)例

    Java返回分頁結(jié)果集的封裝代碼實(shí)例

    這篇文章主要介紹了java返回分頁結(jié)果集的封裝代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • java使用MulticastSocket實(shí)現(xiàn)基于廣播的多人聊天室

    java使用MulticastSocket實(shí)現(xiàn)基于廣播的多人聊天室

    這篇文章主要為大家詳細(xì)介紹了java使用MulticastSocket實(shí)現(xiàn)基于廣播的多人聊天室,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • SpringBoot整合Jackson的過程詳解

    SpringBoot整合Jackson的過程詳解

    這篇文章給大家介紹了SpringBoot整合Jackson的整合過程,文中通過代碼示例給給大家介紹的非常詳細(xì),并附帶附工具類與使用案例,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • SpringBoot響應(yīng)處理之以Json數(shù)據(jù)返回的實(shí)現(xiàn)方法

    SpringBoot響應(yīng)處理之以Json數(shù)據(jù)返回的實(shí)現(xiàn)方法

    這篇文章主要介紹了SpringBoot整合Web開發(fā)其中Json數(shù)據(jù)返回的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • 使用IDEA配置Mybatis-Plus框架圖文詳解

    使用IDEA配置Mybatis-Plus框架圖文詳解

    這篇文章主要介紹了使用IDEA配置Mybatis-Plus框架,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Java8實(shí)戰(zhàn)之Stream的延遲計(jì)算

    Java8實(shí)戰(zhàn)之Stream的延遲計(jì)算

    JDK中Stream的中間函數(shù)如 filter(Predicate super T>)是惰性求值的,filter并非對(duì)流中所有元素調(diào)用傳遞給它的Predicate,下面這篇文章主要給大家介紹了關(guān)于Java8實(shí)戰(zhàn)之Stream延遲計(jì)算的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Java如何導(dǎo)出數(shù)據(jù)庫中的所有數(shù)據(jù)表到指定文件夾

    Java如何導(dǎo)出數(shù)據(jù)庫中的所有數(shù)據(jù)表到指定文件夾

    這篇文章主要介紹了Java導(dǎo)出數(shù)據(jù)庫中的所有數(shù)據(jù)表到指定文件夾,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Java程序中的延遲加載功能使用

    Java程序中的延遲加載功能使用

    這篇文章主要介紹了Java程序中的延遲加載功能使用,一定程度上有助于提升性能和降低內(nèi)存使用率,需要的朋友可以參考下
    2015-07-07
  • SpringMVC處理數(shù)據(jù)輸出的實(shí)例代碼

    SpringMVC處理數(shù)據(jù)輸出的實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于SpringMVC處理數(shù)據(jù)輸出的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05

最新評(píng)論

西华县| 隆化县| 门头沟区| 滦南县| 鸡西市| 弥勒县| 巴马| 扎鲁特旗| 凤庆县| 四川省| 鹤岗市| 正蓝旗| 东辽县| 连云港市| 江山市| 桃源县| 宁津县| 盘锦市| 乌鲁木齐市| 宁陵县| 达拉特旗| 富蕴县| 蓝山县| 东台市| 灵寿县| 舞钢市| 南宫市| 德江县| 潞城市| 炎陵县| 甘肃省| 全南县| 东莞市| 云林县| 白山市| 渑池县| 彭山县| 临潭县| 卢湾区| 邵阳市| 浦北县|