spring原始碼解析 單例Bean迴圈依賴解決方法

2021-10-04 04:32:59 字數 1244 閱讀 8366

0x01、前提條件

0x02、解決方法

1、 bean工廠在建立bean之前會嘗試從快取中拿到bean,bean工廠中定義了**快取:

singletonobjects:一級快取

earlysingletonobjects:二級快取

singletonfactories:**快取

以下**片段摘自defaultsingletonbeanregistry類

protected object getsingleton

(string beanname,

boolean allowearlyreference)}}

}return

(singletonobject != null_object ? singletonobject : null)

;}

2、 首次建立bean的時候,從快取中是拿不到東西的,所以需要建立,bean在建立之前先對其標記為正在建立:

//bean在建立之前先對它做標記,表示當前bean正在建立中

beforesingletoncreation

(beanname)

;

3、 正式建立bean物件,建立完成後將bean用物件工廠物件封裝下放入到 singletonfactories物件工廠快取中

//將當前bean的物件工廠放入到bean工廠快取中。

addsingletonfactory

(beanname,

newobjectfactory

()})

;

4、物件建立完成後,需要處理其依賴屬性。假設當前bean為a,a依賴b,b又依賴a,對b注入a屬性時,可以從**快取中拿到bean,拿出之後會將當前bean放入二級快取中,這樣就可以解決迴圈依賴,記住此時a物件仍然是正在建立標記。還有另一種情況,a依賴b,b依賴a同時又依賴c,c又依賴a,假設先對b注入a屬性,再對c注入a屬性,此時c是從二級快取中拿出來的。

5、將當前bean放入一級快取中,並移除正在建立標記。

0x03 總結

bean正在建立情況下:只有一次機會從**快取中拿到bean,從**快取中獲取的bean是需要經過後置處理處理的,為避免重複處理,需要將其放入到二級快取中,其他時候都是從二級快取中拿到的。

bean建立完成後,都是從一級快取中拿到bean。

spring原始碼解析

spring源 解析 一 ioc容器 spring源 解析 二 ioc容器在web容器中的啟動 spring源 解析 三 spring jdbc spring源 解析 四 spring mvc spring源 解析 五 spring aop獲取proxy spring源 解析 六 spring宣告式...

Spring原始碼解析

spring原始碼解析 收藏 spring源 解析 一 ioc容器 spring源 解析 二 ioc容器在web容器中的啟動 spring源 解析 三 spring jdbc spring源 解析 四 spring mvc spring源 解析 五 spring aop獲取proxy spring源...

Spring原始碼解析之 Aop原始碼解析(2)

spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...