Spring是怎么解決循環(huán)依賴的?

Spring是怎么解決循環(huán)依賴的?
首先,Spring 解決循環(huán)依賴有兩個前提條件:

不全是構(gòu)造器方式的循環(huán)依賴
必須是單例
基于上面的問題,我們知道Bean的生命周期,本質(zhì)上解決循環(huán)依賴的問題就是三級緩存,通過三級緩存提前拿到未初始化完全的對象。

第一級緩存:用來保存實例化、初始化都完成的對象

第二級緩存:用來保存實例化完成,但是未初始化完成的對象

第三級緩存:用來保存一個對象工廠,提供一個匿名內(nèi)部類,用于創(chuàng)建二級緩存中的對象

image.png

假設一個簡單的循環(huán)依賴場景,A、B互相依賴。


image.png

A對象的創(chuàng)建過程:

創(chuàng)建對象A,實例化的時候把A對象工廠放入三級緩存


image.png

2.A注入屬性時,發(fā)現(xiàn)依賴B,轉(zhuǎn)而去實例化B

3.同樣創(chuàng)建對象B,注入屬性時發(fā)現(xiàn)依賴A,一次從一級到三級緩存查詢A,從三級緩存通過對象工廠拿到A,把A放入二級緩存,同時刪除三級緩存中的A,此時,B已經(jīng)實例化并且初始化完成,把B放入一級緩存。

image.png

4.接著繼續(xù)創(chuàng)建A,順利從一級緩存拿到實例化且初始化完成的B對象,A對象創(chuàng)建也完成,刪除二級緩存中的A,同時把A放入一級緩存

5.最后,一級緩存中保存著實例化、初始化都完成的A、B對象


image.png

因此,由于把實例化和初始化的流程分開了,所以如果都是用構(gòu)造器的話,就沒法分離這個操作,所以都是構(gòu)造器的話就無法解決循環(huán)依賴的問題了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容