Spring技術知識點總結之一 迴圈依賴

2021-10-07 22:05:57 字數 1413 閱讀 6900

《spring ioc迴圈依賴解決方案分析》

《spring5原始碼閱讀--如何解決迴圈依賴?》

在 spring 中獲取乙個 bean,是通過獲取 beandefinition 實現的:在定義 bean 資訊的 xml 檔案中,beandefinitionreader 讀取指定路徑下的 xml 檔案,獲取 bean 定義資訊並封裝成 beandefinition 物件,該例項物件包含依賴關係資訊 dependson。通常依賴關係是在 xml 的 p:***-ref,或者通過類的 @autowired 等手段實現的。

迴圈依賴,就是在 classa 和 classb 的屬性中,都互相包含彼此。spring 避免迴圈依賴出現的錯誤,使用了三層快取:

分析getsingleton()方法:

public object getsingleton

(string beanname)

protected object getsingleton

(string beanname,

boolean allowearlyreference)}}

}return

(singletonobject != null_object ? singletonobject : null)

;}

依舊以 classa 和 classb 為例,假設兩個例項物件存在迴圈依賴關係,且 classa 物件首先在 spring 容器中初始化。

構建 classa 物件的未填充 beandefinition 物件,並置入 earlysingletonobjects,同時**將該 bean 從工廠快取 singletonfactories 中除掉**,為解決迴圈依賴做準備;

嘗試向 classa 物件中填充內容,且填充過程到需要填充 classb 物件;

首先分別嘗試從完全例項化完畢的單例快取 singletonobjects 和不完全例項化的 earlysingletonobjects 中獲取 classb 物件,都獲取失敗;

嘗試初始化 classb 物件的 beandefinition。在初始化過程中,classb 物件需要引用到 classa 物件例項,此時出現了迴圈依賴的情況;

classb 物件嘗試從 singletonobjects 中獲取 classa,但獲取失敗(因為此時 classa 當前還在初始化過程中,所以沒有放入 singletonobjects 中);然後從 earlysingletonobjects 中獲取 classa 的引用

classb 獲取到 classa 的引用後,可以繼續完成例項化過程;

classb 例項化完成後,例項物件返回給 classa,然後 classa 完成其實例化過程。

至此,迴圈依賴的 classa 和 classb 都完成了例項化。

java基礎技術知識點總結 JDBC

jdbc主要是 載入驅動 class.forname com.mysql.jdbc.driver 連線到指定資料庫,需要制定url username password,可以直接寫也可以用配置檔案等 connection conn drivermanager.getconnection jdbc my...

前端的一些技術知識點

文字框id focus cursor pointer canvas.onmousedown function e else if e.button 2 onselectstart return false ndragstart return false 父容器 overflow hidden hei...

WebRtc(網頁即時通訊技術)知識點總結

前言實現原理 p2p連線模式 一般我們傳統的連線方式,都是以伺服器為中介的模式 類似http協議 客戶端服務端 當然這裡服務端返回的箭頭僅僅代表返回請求資料 而點對點的連線恰恰資料通道一旦形成,中間是不經過服務端的,資料直接從乙個客戶端流向另乙個客戶端 客戶端a 客戶端b 客戶端a 客戶端c 可以無...