spring迴圈依賴問題

2022-07-23 16:12:29 字數 1330 閱讀 3858

在開始介紹各種情況之前,首先要了解以下三個知識點:

spring中依賴注入的方式有兩種,屬性注入與構造器注入。上面的**中,類a就是通過屬性注入的方式注入了b,類b是通過構造器注入的方式注入了a。

spring中的bean根據作用域的不同,可以大體分為兩類,singleton和prototype。singleton在乙個容器中,只會有乙個例項;而prototype在每次呼叫時,都會產生乙個新的例項。

spring中,單例bean有延遲載入和立即載入兩種載入方式,其中立即載入模式會在容器啟動的時候就建立bean,而延遲載入會在容器啟動後,使用到bean的時候再載入它。本篇分析一律使用延遲載入,因為有時候單例bean的載入順序,會影響到建立bean的成功或失敗。

如果迴圈依賴的bean都是通過構造器注入依賴,那麼不管它們是singleton還是prototype,都會失敗。

如果迴圈依賴的bean都是prototype,那麼不管它們是通過構造器注入依賴還是通過屬性注入依賴,都會失敗。

如果迴圈依賴的bean既有構造器注入也有屬性注入,既有singleton也有prototype,在容器啟動後,只有當獲取的第乙個bean是通過屬性注入依賴的singleton時,才會成功,別的情況都會失敗。

所以最終結論就是:

如果多個bean存在迴圈依賴,在spring容器啟動後,只有當獲取的第乙個bean是通過屬性注入依賴的singleton時,才會成功,別的情況都會失敗

各種情況測試結果及分析:

spring容器啟動後,如果我們去獲取singletona,那麼容器的操作步驟大致如下:

1、嘗試建立bean singletona,發現singletona是singleton,且不是通過構造器注入依賴,那麼先使用預設構造器建立乙個a的例項,並儲存對它的引用,並且將singletona標記為「正在建立中的singleton」。然後發現singletona依賴了singletonb,所以嘗試建立singletonb。

2、嘗試建立bean singletonb,發現singletonb是singleton,且不是通過構造器注入依賴,那麼先使用預設構造器建立乙個b的例項,並儲存對它的引用,並且將singletonb標記為「正在建立中的singleton」。然後發現singletonb依賴了singletona,所以嘗試建立singletona。

4、容器將singletona通過setter方法注入到singletonb,從而singletonb完成建立。

5、容器將singletonb通過setter方法注入到singletona,從而singletona完成建立。

原始碼解析:

Spring 迴圈依賴問題

a class com.demo.circularreference.a name b ref b bean b class com.demo.circularreference.b name a ref a bean public classa public class b spring中將迴圈依...

Spring迴圈依賴問題(筆記)

a類中有成員變數b類的物件。b類中也有成員變數a類的物件。簡單來說就,就是如下情況 class a class b 在一開始的開始 也就是程式第一次獲取a的例項時,需要從spring容器單例池中獲取。但此時單例池中還沒有a的例項,所以要new 乙個a物件。在a例項 建立和初始化的時候,要獲取成員變數...

spring 迴圈依賴

構造器依賴無法解決,使用 快取解決field屬性依賴。a的屬性依賴b,b的屬性依賴a 建立a,設定依賴屬性b,發現b沒有建立,建立b,設定依賴屬性a,先從一級快取singletonobjects中去獲取。如果獲取到就直接return 如果獲取不到或者物件正在建立中 issingletoncurren...