在看spring 迴圈依賴的問題中,知道原理,網上一堆的資料有講原理。 但今天在看**過程中,又產生了疑問。
疑問點如下:
// 疑問點: 先進行 dependon 判斷想著這裡先會 判斷是否有依賴, bean 提前**的**在 檢查依賴的後面, 那迴圈依賴,不就進入死迴圈了嗎? 是否有統統疑問的朋友~~~ --也不知道當時這麼想的,只能說 還有提高的空間。string dependson = mbd.getdependson();
if (dependson != null)
registerdependentbean(dep, beanname);
try
catch (nosuchbeandefinitionexception ex)
}}// create bean instance.
if (mbd.issingleton())
catch (bean***ception ex)
});bean = getobjectforbeaninstance(sharedinstance, name, beanname, mbd);
}
心想不對,寫了簡單的demo,開始debug了。
結論:這裡的 mbd.getdependson() 只有在 配置了 depend-on 標籤的時候,才會解析,有值。!!! 這也是導致 理解迴圈依賴 有問題的關鍵。
這裡先簡單記錄下 現在理解的 迴圈依賴的大致流程:
1、depende-on 標籤的情況
注: depends-on適用於表面上看起來兩個bean之間沒有使用屬性之類的強連線的bean,但是兩個bean又確實存在前後依賴關係的情況,使用了depends-on的時候,依賴他人的bean是先於被依賴bean銷毀的。 一般不會這麼使用。也就是這樣配置的情況,才會丟擲 beancreationexception 異常。
if (isdependent(beanname, dep))2、正確的 xml 配置的迴圈依賴 demo
3、註解的方式解決迴圈依賴
@service都說這段是 解決 迴圈依賴的 關鍵所在:public class aservice
@service
public class bservice
protected object getsingleton(string beanname, boolean allowearlyreference) }}這裡主要涉及到3個快取, singletonobjects,earlysingletonobjects, singletonfactories。}return singletonobject;
}
這裡只考慮 a--b --a的情況:
object sharedinstance = getsingleton(beanname);第一次 getbean(a)的時候, 返回是 null, 會走如下流程:
// create bean instance.在 createbean -> docreate中有如下: addsingletonfactory() 提前 **當前類 工廠,到 singletonfactory中if (mbd.issingleton())
catch (bean***ception ex)
});bean = getobjectforbeaninstance(sharedinstance, name, beanname, mbd);
}
boolean earlysingletonexposure = (mbd.issingleton() && this.allowcircularreferences &&呼叫b的過程中,和a類似, 也會 提前 在singletonfactory 中**, 然後在 populatebean 中,注入 a屬性值時, 因為a未初始化,再次 去請求 getbean(a), 這次 在 getsingleton()中,因為 a提前**,所以在getsingleton 中 返回 a(可能未完全初始化),最終呼叫 getobjectforbeaninstance 方法,返回 完全例項話的 bean a, 然後注入到b 中,並完成b的 初始化, bean都會 放進singletonobjects 快取中。issingletoncurrentlyincreation(beanname));
if (earlysingletonexposure)
addsingletonfactory(beanname, () -> getearlybeanreference(beanname, mbd, bean));
}
todo: 在 populatebean 中怎麼檢測 到 properties,這塊還需 仔細的去debug,還沒完全理清楚。
參考:
Spring迴圈依賴深度理解
並非所有的建構函式依賴都不可以被解決,而是必須要保證先初始化的bean可以正常的被例項化,因為先初始化的bean需要從 快取中公升級到二級快取,也就是說先初始化的類中不可以通過建構函式注入的方式去注入迴圈依賴的bean 二級快取的作用 如果多個類同時迴圈依賴同乙個類,那麼我們需要保證獲取到的例項化物...
spring迴圈依賴深入理解
例項a 例項b 例項c 例項a。例項間的依賴構成閉環。spring 預設是支援迴圈依賴的 setter public abstractautowirecapablebeanfactory 迴圈依賴分為三種 構造器迴圈依賴 setter迴圈依賴 多例迴圈依賴 其中第一種和第三種是直接報錯的,sprin...
Spring的迴圈依賴
面試官經常會問 spring的兩個bean可以迴圈依賴嗎?答 spring預設單例支援迴圈依賴 我們首先在乙個spring專案裡面準備兩個bean,讓它們互相依賴注入 然後如圖建立乙個配置類,用來掃瞄bean componentscan com.zyc public class 最後建立乙個test...