Spring原理 二 迴圈依賴原理

2021-10-10 23:01:19 字數 1524 閱讀 7099

@component

public

class

x}

@component

public

class

y}

spring解決迴圈依賴的訣竅就在於singletonfactories這個**快取,x首先完成例項化(呼叫了構造器),並且將自己提前**到singletonfactories中(如果支援迴圈依賴(spring預設開啟,變數值為true表示),會將objectfactory物件工廠put進singletonfactories中),此時進行填充屬性,發現自己依賴物件y,此時就嘗試去get(y),發現y還沒有被例項化,所以走例項化流程,例項化後y在填充屬性的時候發現自己依賴了物件x,於是嘗試get(x),嘗試一級快取singletonobjects(肯定沒有,因為x還沒初始化完全),嘗試二級快取earlysingletonobjects(條件是一級快取中拿不到並且物件正在建立中(正在建立的物件會被放在乙個set集合中),也沒有),嘗試**快取singletonfactories(拿到後將其放入到二級快取,然後將嘗試**快取singletonfactories內的物件remove掉),由於a通過objectfactory將自己提前**了,所以y能夠通objectfactory.getobject拿到x物件(並且可以通過工廠提前實現aop),y完全初始化之後將自己放入到一級快取singletonobjects中,x此時能拿到y的物件最終x也完成了初始化,進去了一級快取singletonobjects中。

propertyvalues pvstouse = ibp.

postprocessproperties

(pvs, bw.()

, beanname)

;

當進行x的屬性注入時,發現需要注入y,就會去單例池拿y,上面方法最終會執行到

beanfactory.getbean(beanname),根據上篇文章,getbean最終會呼叫getsingleton

protected object getsingleton

(string beanname,

boolean allowearlyreference)}}

}return singletonobject;

}

上一步返回false,就會進行y的建立,和x一樣最終也會走到屬性注入,這時就去就會去單例池拿x,還是會走到上述**

protected object getsingleton

(string beanname,

boolean allowearlyreference)}}

}return singletonobject;

}

所以y在進行屬性注入時,能在**快取中拿到x,完成注入,從而y完成建立,將自己放入一級快取singletonobjects中。然後x就能拿到y,完成建立

注:構造器方式無法解決迴圈依賴是因為**快取的前提是完成例項化執行了構造器,所以構造器的迴圈依賴沒法解決

Spring處理迴圈依賴原理

大家都清楚spring框架實現類ioc,即實現了依賴的自動注入,這是spring的基本功能之一,並且對於迴圈依賴,spring也可以自動注入,但是前提是存在迴圈依賴關係的bean必須是單例的,原型的不可以。1.什麼是迴圈依賴 簡單來說就是兩個類的相互引用,舉個例子來說,a類定義乙個b類的例項字段,b...

spring解決迴圈依賴的原理 構造注入除外

先說結論,spring通過 快取機制來解決迴圈依賴問題,構造器依賴除外,即構造器注入可能會報錯。迴圈依賴的情況如下 首先spring初始化bean的步驟如下 這裡只需要簡單的理解為三步 例項化填充屬性 注入依賴 初始化完成 spring在建立bean a的時候會先去一級快取 singletonobj...

spring 迴圈依賴

構造器依賴無法解決,使用 快取解決field屬性依賴。a的屬性依賴b,b的屬性依賴a 建立a,設定依賴屬性b,發現b沒有建立,建立b,設定依賴屬性a,先從一級快取singletonobjects中去獲取。如果獲取到就直接return 如果獲取不到或者物件正在建立中 issingletoncurren...