Spring 怎麼解決迴圈依賴

2022-09-11 06:39:12 字數 654 閱讀 4708

依舊以上面a、b類使用屬性field注入迴圈依賴的例子為例,對整個流程做文字步驟總結如下:

使用context.getbean(a.class),旨在獲取容器內的單例a(若a不存在,就會走a這個bean的建立流程),顯然初次獲取a是不存在的,因此走a的建立之路~

例項化a(注意此處僅僅是例項化),並將它放進快取(此時a已經例項化完成,已經可以被引用了)

初始化a:@autowired依賴注入b(此時需要去容器內獲取b)

為了完成依賴注入b,會通過getbean(b)去容器內找b。但此時b在容器內不存在,就走向b的建立之路~

例項化b,並將其放入快取。(此時b也能夠被引用了)

初始化b,@autowired依賴注入a(此時需要去容器內獲取a)

此處重要:初始化b時會呼叫getbean(a)去容器內找到a,上面我們已經說過了此時候因為a已經例項化完成了並且放進了快取裡,所以這個時候去看快取裡是已經存在a的引用了的,所以getbean(a)能夠正常返回

b初始化成功(此時已經注入a成功了,已成功持有a的引用了),return(注意此處return相當於是返回最上面的getbean(b)這句**,回到了初始化a的流程中~)。

因為b例項已經成功返回了,因此最終a也初始化成功

到此,b持有的已經是初始化完成的a,a持有的也是初始化完成的b,完美~

spring解決迴圈依賴

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

spring解決迴圈依賴

之前面試有被問到過,面試官很調皮,我擅長的點沒有問,然後抽了乙個點讓我回答,這個點考察了原始碼的理解,當時只是大概記得是提前暴露,但是細節答得有些粗糙,特補充一下,protected object getsingleton string beanname,boolean allowearlyrefe...

知識積累 Spring迴圈依賴問題怎麼解決?

即 a依賴b,b依賴a,構成乙個閉環。2.1 構造器依賴注入 spring無法解決 2.2 setter方法依賴注入 spring的單例bean的建立分為三步 this.populatebean 填充屬性 this.initializebean 初始化 迴圈依賴的問題主要發生在第一步和第二步,spr...