spring解決迴圈依賴

2021-10-09 13:13:17 字數 1388 閱讀 1546

或者原型(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...