假設有下面三個類:
public
classa.
..}public
classb.
..}public
classc.
..}
那麼問題來了,該如何建立乙個a
的物件呢?
a a =
newa
(newb(
newc
(newa(
...)
));// wtf ???
我們發現,無法為a
建立物件,這個例子揭示了一種由建構函式導致的迴圈依賴問題。a
、b
、c
三個類之間通過構造函式引數產生了迴圈依賴,由於每個類都要求在建構函式中傳入已初始化的其它物件,這就導致無法為這三個類中的任乙個類建立物件。
解決方案也很簡單,只需把屬性賦值推遲到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...