Spring迴圈依賴(縮略版)

2021-10-09 10:42:46 字數 1111 閱讀 8499

spring迴圈依賴問題也算是個老掉牙的問題,一搜一大把,這裡純粹是為了給自己做個筆記,所以寫(水)一篇部落格

那麼為什麼要叫縮略版呢,因為這裡不打算分析spring原始碼來講了(主要是因為懶),能畫圖那就不分析**

首先spring建立乙個物件分為了三步:例項化 -> 填充屬性 -> 初始化

那如果是在構造器中進行了迴圈依賴,假如a的構造器依賴於b,b的構造器中依賴於a,那麼就類似於死鎖了,spring也救不了你

那麼如果是使用setter方式的話呢?

@component

public

classa}

@component

public

class

b}

那就不一樣了,spring預設構造的是物件單例,同時有**快取,singletonobjects(一級),earlysingletonobjects(二級),singletonfactories(**),一級找不到就往下接著找,找到了的話就放入上一層中,這個應該很好理解吧

以上面的**來畫圖說明一下setter方式是如何解決迴圈依賴的

簡單解釋一下圖中的步驟

a例項化完成,接著屬性填充的時候找不到b,所以去執行b的例項化

b例項化完成,屬性填充的時候去找a

一二**快取依次往下找,因為a還未初始化完成,所以一二級快取都找不到,在**快取中找到了還未初始化完成的a

b完成屬性填充和初始化,將自己加入到了一級快取中

a接著進行屬性填充,獲取到了b,接著進行初始化,a初始化完成,spring迴圈依賴解決

總結:spring如果是構造器構注入的話,無法解決迴圈依賴(這裡的構造器注入說的是兩個迴圈依賴的類都使用構造器注入,如果按照上面**的順序,a使用setter注入,b使用構造器注入的話,也是可以解決迴圈依賴的);如果是setter注入的話,依靠spring的物件生成步驟和一二**快取的機制可解決迴圈依賴

spring 迴圈依賴

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

spring迴圈依賴

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

spring避免迴圈依賴

spring避免迴圈依賴 參見數 spring原始碼深度解析 第98頁 什麼是迴圈依賴,例如a引用b,b引用c,c引用a。1.如果通過構造器注入構成的迴圈依賴,這種情況下是沒有辦法解決的。例如如下配置 2.通過setter注入方式構成的迴圈依賴,只能解決單例作用域的bean迴圈依賴。通過提前暴露乙個...