或者原型(prototype)的場景是不支援迴圈依賴的,丟擲異常。
基於構造器的迴圈依賴,是不存在的。
那麼預設單例的屬性注入場景,spring是如何支援迴圈依賴的?
首先,spring內部維護了三個map,也就是我們通常說的**快取。
在spring的defaultsingletonbeanregistry類中,類上方掛著這三個map:
後兩個map其實是「墊腳石」級別的,只是建立bean的時候,用來借助了一下,建立完成就清掉了。
為什麼成為後兩個map為墊腳石,假設最終放在singletonobjects的bean是你想要的一杯「涼白開」。
那麼spring準備了兩個杯子,即singletonfactories和earlysingletonobjects來回「倒騰」幾番,把熱水晾成「涼白開」放到singletonobjects中
定義兩個類a與b:
public class a
public void setb(b b)
}public class b
public void seta(a a)
private a a;
}public class circulardependency ;
// 假裝專案初始化例項化所有bean
for (class aclass : classes)
// check
system.out.println(getbean(b.class).geta() == getbean(a.class));
system.out.println(getbean(a.class).getb() == getbean(b.class));
}private static t getbean(classbeanclass) throws exception
// 將物件本身例項化
object object = beanclass.getdeclaredconstructor().newinstance();
// 放入快取
cachemap.put(beanname, object);
// 把所有字段當成需要注入的bean,建立並注入到當前bean中
field fields = object.getclass().getdeclaredfields();
for (field field : fields)
// 屬性填充完成,返回
return (t) object;}}
這段**的效果,其實就是處理了迴圈依賴,並且處理完成後,cachemap中放的就是完整的「bean」 spring解決迴圈依賴
之前面試有被問到過,面試官很調皮,我擅長的點沒有問,然後抽了乙個點讓我回答,這個點考察了原始碼的理解,當時只是大概記得是提前暴露,但是細節答得有些粗糙,特補充一下,protected object getsingleton string beanname,boolean allowearlyrefe...
spring迴圈依賴的解決
當a類中有b屬性,b類中有a屬性的時候,就會產生迴圈依賴。a在例項化的時候,引用了b,但是b麼有例項化,所以就會先例項化b,這個時候發現b又引用了a,但是a還沒有例項化,所以就造成了迴圈依賴。我們來看看spring是如何解決的 public class classa public classa pu...
Spring解決迴圈依賴 筆記
參考 spring內部維護了三個map,也就是我們通常說的 快取,位置在defaultsingletonbeanregistry private final mapsingletonobjects new concurrenthashmap 256 private final map singlet...