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

Spring?Boot解決循環(huán)依賴的過程詳細(xì)記錄

 更新時(shí)間:2024年09月12日 08:29:06   作者:從零開始的-CodeNinja之路  
這篇文章主要介紹了Spring?Boot解決循環(huán)依賴的過程,Spring框架通過三級(jí)緩存機(jī)制解決循環(huán)依賴問題,分別為singletonObjects、earlySingletonObjects和singletonFactories,需要的朋友可以參考下

循環(huán)依賴

一、前言

環(huán)依賴是指兩個(gè)或者多個(gè)bean互相依賴對(duì)方,從而形成一個(gè)閉環(huán)。例如:Bean A依賴于Bean B,而Bean B又依賴于Bean A??赡軙?huì)導(dǎo)致Spring在嘗試創(chuàng)建這些bean實(shí)例時(shí)出現(xiàn)問題,因?yàn)樗麄兓ハ嗟却龑?duì)方被創(chuàng)建,最終導(dǎo)致應(yīng)用程序無法啟動(dòng)。

Spring是如何發(fā)現(xiàn)這種循環(huán)依賴的問題的呢?
通過依賴圖來檢測(cè)和發(fā)現(xiàn)循環(huán)依賴問題。如下步驟:

二、Bean的創(chuàng)建過程

Spring容器在啟動(dòng)時(shí),會(huì)掃描配置文件(appliactionContext.xml)或者注解定義的bean,并且嘗試創(chuàng)建這些bean的實(shí)例。創(chuàng)建bean實(shí)例的過程如下

  • 實(shí)例化:創(chuàng)建bean的實(shí)例。
  • 屬性填充:為bean注入依賴其他的bean。
  • 初始化:執(zhí)行自定義的初始化方法。
  • 依賴注入過程

在屬性填充階段,Spring會(huì)為每個(gè)bean注入他所依賴的bean。在這個(gè)過程中,Spring會(huì)跟蹤哪些bean正在被創(chuàng)建,以便檢測(cè)循環(huán)依賴。

三、 循環(huán)依賴檢測(cè)機(jī)制

Spring通過一個(gè)名為“DefaultSingletonBeanRegistry”的類來跟蹤單例bean的創(chuàng)建狀態(tài)。該類維護(hù)了三個(gè)主要的緩存來管理bean的創(chuàng)建過程。

  • singletonObjects:一級(jí)緩存(存儲(chǔ)完全初始化好的bean)
  • earlySingletonObjects:二級(jí)緩存(存儲(chǔ)早期暴露的單例bean,用于解決循環(huán)依賴)
  • singletonFactories:三級(jí)緩存(存儲(chǔ)用于創(chuàng)建bean實(shí)例的工廠)

具體的檢測(cè)步驟

3.1 實(shí)例化階段

當(dāng)Spring開始實(shí)例化一個(gè)bean時(shí),它會(huì)將這個(gè)bean標(biāo)記為正在創(chuàng)建。這一步是通過將bean名稱添加到一個(gè)“正在創(chuàng)建中的bean”集合(‘singletonCurrentlyInCreaontion’)中來實(shí)現(xiàn)的。

3.2 屬性填充階段

在屬性填充階段,Sping會(huì)為該bean注入其依賴的其他的bean。此時(shí)Spring會(huì)檢查這個(gè)“其他的bean”是否已經(jīng)在創(chuàng)建過程中。

如果依賴的bean已經(jīng)在創(chuàng)建中,Spring會(huì)檢測(cè)到循環(huán)依賴,并根據(jù)不同的注入方式采取不同的處理方式。
如果是構(gòu)造函數(shù)注入,Spring會(huì)拋出‘BeanCurrentlyInCreationException’,因?yàn)闊o法解決構(gòu)造函數(shù)中注入的循環(huán)依賴。

如果是Setter注入,Spring會(huì)從‘earlySingletonObjects’或‘singletonFactories’中獲取依賴的bean,提前暴露一個(gè)部分創(chuàng)建的bean引用來解決循環(huán)依賴。

舉例:

如Bean A和Bean B循環(huán)依賴

@Component
public class A {
    @Autowired
    private B b;

    public A() {
        System.out.println("A is created");
    }
}

@Component
public class B {
    @Autowired
    private A a;

    public B() {
        System.out.println("B is created");
    }
}

3.3 依賴注入

Spring的依賴注入過程:

  • 實(shí)例化Bean A

將Bean A 標(biāo)記為正在創(chuàng)建,并添加到‘singletonCurrentlyInCreation’集合中。
實(shí)例化Bean A,并將其放入到三級(jí)緩存‘singletonFactories’中。(三級(jí)緩存存放的是創(chuàng)建實(shí)例化的bean工廠)

  • 填充Bean A的屬性

此時(shí)發(fā)現(xiàn)Bean A依賴Bean B ,于是開始創(chuàng)建Bean B。
將Bean B標(biāo)記為正在創(chuàng)建,并放入到‘singletonCurrentlyInCreation’集合中。
實(shí)例化Bean B,并將其放入到三級(jí)緩存‘singletonFactories’中。

  • 填充Bean B的屬性

發(fā)現(xiàn)Bean B依賴于Bean A 。此時(shí),檢查到Bean A 已經(jīng)在創(chuàng)建過程中,因此發(fā)現(xiàn)了循環(huán)依賴。
由于是Setter方法注入,Spring會(huì)從三級(jí)緩存‘singletonFactories’中獲取一個(gè)部分創(chuàng)建的Bean A實(shí)例,提前暴露出來,放入二級(jí)緩存‘earlySingletonObjects’中。
使用這個(gè)部分創(chuàng)建出來的Bean A實(shí)例 來填充Bean B的屬性。

  • 完成Bean B的創(chuàng)建

Bean B中的所有屬性填充完畢后,Spring將Bean B的實(shí)例從三級(jí)緩存‘singletonFactories’中移到一級(jí)緩存‘singletonObjects’完全初始化好的bean中。

  • 回到Bean A的創(chuàng)建

繼續(xù)為Bean A填充屬性,此時(shí)可以從一級(jí)緩存‘singletonObejcts’中獲取到完整的Bean B實(shí)例。
完成Bean A的創(chuàng)建,并將其從三級(jí)緩存‘singletonFactories’中移到一級(jí)緩存‘singletonObjects’中。

總結(jié)

到此這篇關(guān)于Spring Boot解決循環(huán)依賴的文章就介紹到這了,更多相關(guān)Spring Boot循環(huán)依賴解決內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

手游| 荃湾区| 宜章县| 德格县| 吴桥县| 泾川县| 曲周县| 鄂温| 巩留县| 闽侯县| 汨罗市| 阳东县| 新绛县| 孟连| 博兴县| 嘉鱼县| 静宁县| 兴和县| 兴业县| 和平区| 永定县| 永德县| 大同市| 延津县| 外汇| 龙州县| 定陶县| 新乐市| 西乌珠穆沁旗| 临颍县| 开化县| 凤台县| 永泰县| 涿鹿县| 普兰县| 台湾省| 无极县| 滨州市| 宝鸡市| 东方市| 惠来县|