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

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

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

循環(huán)依賴

一、前言

環(huán)依賴是指兩個或者多個bean互相依賴對方,從而形成一個閉環(huán)。例如:Bean A依賴于Bean B,而Bean B又依賴于Bean A??赡軙?dǎo)致Spring在嘗試創(chuàng)建這些bean實例時出現(xiàn)問題,因為他們互相等待對方被創(chuàng)建,最終導(dǎo)致應(yīng)用程序無法啟動。

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

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

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

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

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

三、 循環(huán)依賴檢測機制

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

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

具體的檢測步驟

3.1 實例化階段

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

3.2 屬性填充階段

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

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

如果是Setter注入,Spring會從‘earlySingletonObjects’或‘singletonFactories’中獲取依賴的bean,提前暴露一個部分創(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的依賴注入過程:

  • 實例化Bean A

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

  • 填充Bean A的屬性

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

  • 填充Bean B的屬性

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

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

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

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

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

總結(jié)

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

相關(guān)文章

最新評論

天镇县| 湄潭县| 荣昌县| 怀来县| 漳州市| 南平市| 泗阳县| 启东市| 杨浦区| 绥芬河市| 威信县| 黑水县| 兴安县| 伊吾县| 安顺市| 星子县| 五莲县| 怀来县| 弥勒县| 新乡县| 阳城县| 独山县| 濉溪县| 浦东新区| 巴楚县| 莱阳市| 锡林郭勒盟| 河东区| 衡阳市| 三门峡市| 平定县| 浦北县| 河北省| 仪陇县| 永年县| 郯城县| 绵阳市| 福海县| 吉林市| 莆田市| 黑水县|