解決建構函式導致的迴圈依賴

2021-10-19 11:33:36 字數 828 閱讀 2692

假設有下面三個類:

public

classa.

..}public

classb.

..}public

classc.

..}

那麼問題來了,該如何建立乙個a的物件呢?

a a =

newa

(newb(

newc

(newa(

...)

));// wtf ???

我們發現,無法為a建立物件,這個例子揭示了一種由建構函式導致的迴圈依賴問題。abc三個類之間通過構造函式引數產生了迴圈依賴,由於每個類都要求在建構函式中傳入已初始化的其它物件,這就導致無法為這三個類中的任乙個類建立物件。

解決方案也很簡單,只需把屬性賦值推遲到setter函式:

public

classa.

..}public

classb.

..}public

classc.

..}

然後就可以像下面這樣建立物件:

a a =

newa()

;b b =

newb()

;c c =

newc()

;a.setb

(b);

b.setc

(c);

c.seta

(a);

spring解決迴圈依賴的原理 構造注入除外

先說結論,spring通過 快取機制來解決迴圈依賴問題,構造器依賴除外,即構造器注入可能會報錯。迴圈依賴的情況如下 首先spring初始化bean的步驟如下 這裡只需要簡單的理解為三步 例項化填充屬性 注入依賴 初始化完成 spring在建立bean a的時候會先去一級快取 singletonobj...

spring迴圈依賴的解決

當a類中有b屬性,b類中有a屬性的時候,就會產生迴圈依賴。a在例項化的時候,引用了b,但是b麼有例項化,所以就會先例項化b,這個時候發現b又引用了a,但是a還沒有例項化,所以就造成了迴圈依賴。我們來看看spring是如何解決的 public class classa public classa pu...

spring解決迴圈依賴

或者原型 prototype 的場景是不支援迴圈依賴的,丟擲異常。基於構造器的迴圈依賴,是不存在的。那麼預設單例的屬性注入場景,spring是如何支援迴圈依賴的?首先,spring內部維護了三個map,也就是我們通常說的 快取。在spring的defaultsingletonbeanregistry...