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...