Spring學習 迴圈依賴

2021-10-11 00:03:39 字數 1513 閱讀 8294

來自:

由springioc去建立bean物件,主要有兩個問題,乙個死迴圈的建立,乙個是aop的**。

建立過程

先去獲取a,但a例項化的時候,就會把a放到半成品池中去

然後去填充屬性b,然後獲取b,

b在單例池中判斷是否有a,如果沒有就去半成品池中去獲取,

如果半成品中有把a放到b中就進行填充和初始化,然後b初始化成功,b 就可以放到單例池中,

而後a就可以在單例池中獲取到b進行屬性填充,最後也初始化成功,將a放入到單例池中

(這裡有點繞,總之就是半成品池做了個中間媒介)

**快取實現:乙個是單例池,乙個是半成品池,乙個是物件工廠池

**物件的產生是在初始化的時候產生的

首先初始化的時候會呼叫bean處理器,而這個處理器裡面包含了乙個aop的處理器

aop處理器會呼叫createproxy建立**物件

呼叫createproxy有兩種途徑,乙個是後置處理器(正常途徑),乙個是提預處理器(解決問題的關鍵)

過程(有點繞,需要好好理解一下)

當a例項化的時候就會在工廠池裡面建立乙個factory(a) a的物件工廠,這個物件工廠可以呼叫提前處理,建立乙個a的**物件,當然這個factory(a)並不會自動的呼叫,只有當b需要填充屬性的時候才會呼叫

當b填充屬性呼叫factory(a) factory(a)會提前引用建立出來了乙個**物件a,會放入半成品池中,然後把半成品池中的a,填充到b中

b就初始化完成,通過後置處理建立出b的**物件放入單例池中(在b例項化的時候也會建立factory(b),但無人引用就銷毀了)

a填充屬性,由於單例池中有b了就直接填充進去了,然後執行初始化、後置處理建立動態**,由於半成品池中有了a的**物件,所以直接把半成品池中直接拿到單例池,同時再把factory(a)銷毀,這樣兩個**物件就都建立出來了

Spring學習之迴圈依賴

很簡單,就是a物件依賴了b物件,b物件依賴了a物件。例如 a依賴了b class a b依賴了a class b那麼迴圈依賴是個問題嗎?如果不考慮spring,迴圈依賴並不是問題,因為物件之間相互依賴是很正常的事情。例如 a a newa b b newb a.b b b.a a 這樣,a,b就依賴...

spring 迴圈依賴

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

spring迴圈依賴

關於spring迴圈依賴網上有太多的例子,本文只是簡單的記錄一下。本文預設讀者熟悉spring核心之一控制反轉和依賴注入 在我們的開發過程中,我們基本上對迴圈依賴是無感且不用去考慮如何解決。如上圖中classa使用屬性注入了classb,classb使用屬性注入了classa。如上圖這就是產生了迴圈...