Spring循環依賴檢測、解決方法

核心利用二級和三級緩存

1,一級緩存:用於存放完全初始化好的 bean 
2,二級緩存:存放原始的 bean 對象(尚未填充屬性),用於解決循環依賴 */
3,三級級緩存:存放 bean 工廠對象,用於解決循環依賴

 

循環依賴發生的時機:實例化與填充屬性/方法的過程中

檢測循環依賴的過程如下:


1,A 創建過程中需要 B,於是 A 將自己放到三級緩裏面 ,去實例
2,B 實例化的時候需要 A,於是 B 先查一級緩存,沒有,再查二級緩存,還是沒有,再查三級緩存,找到了!
3,然後把三級緩存裏面的這個 A 放到二級緩存裏面,並刪除三級緩存裏面的 A
4,B 順利初始化完畢,將自己放到一級緩存裏面(此時B裏面的A依然是創建中狀態)
5,然後回來接着創建 A,此時 B 已經創建結束,直接從一級緩存裏面拿到 B ,完成創建,並將自己放到一級緩存裏面
如此一來便解決了循環依賴的問題

單例bean的依賴注入分爲構造器注入和setter方法注入。

1,Spring只會解決setter方法注入的循環依賴,構造器注入的循環依賴會拋BeanCurrentlyInCreationException異常。
2,Spring不會解決prototype作用域的bean,因爲Spring容器不進行緩存"prototype"作用域的bean,因此無法提前暴露一個創建中的bean。如果有循環依賴會拋BeanCurrentlyInCreationException異常。

Spring依賴注入方式

1. 接口注入

2. Setter方法注入

3. 構造方法注入

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章