Spring迴圈依賴的解決方案

2021-10-06 10:28:18 字數 880 閱讀 7432

什麼是迴圈依賴?

」迴圈「倆字就足以表明含義了,舉個例子:

在例項化a類時需要依賴到b類的例項,而恰好b類例項也依賴到a類。如圖所示

spring在例項化類a時發現需要類b的例項,所以會先去例項化b類,但是又發現b類需要a類的例項(wtf?) 這樣迴圈下去肯定會出問題的,所以乾脆丟擲beancurrentlyincreationexception異常。

spring如何設定bean的依賴?

這裡我們還要知道spring初始化bean時,設定依賴的三種方式:

通過構造方法的引數來設定

先構建好bean,再通過setter方法設定依賴

先通過有參構造構建bean,再通過setter方法設定依賴(其實就是1、2點結合)

spring官方文件就說明了通過構造方法和通過setter方法構建bean時的不同點:

如何處理迴圈依賴?

1.setter方法通過上面的知識點我們就知道了,setter方法設定依賴時,bean會先被建立,再去尋找所依賴的bean。結合圖1的例子來講:

例項化a類後,發現需要b類例項(a類已經被例項化並放入ioc容器)

此時再去例項化b類後,這個時候b類也發現需要a依賴,而a例項已存在,直接獲取就好

這個時候,迴圈依賴就解決了。上面的步驟只是按邏輯上來講,到底是全部例項化後再進行setter還是發現後再例項化? 還需要更深入的了解才行。

---------未完待續--------

Spring Bean 迴圈依賴解決方案

由於service層互相呼叫,一下子沒有什麼好的拆分方案,所以先解決迴圈依賴問題。現有aservice 和bservice,都在對方bean中注入,導致初始化時迴圈初始報錯,解決方案就是選擇其一使其延遲載入。用配置方式只要將其一設定lazy init,具體沒嘗試過因為不適用配置申明的方式。然後從上下...

記因迴圈依賴的解決方案

迴圈依賴分為2類 dubbo缺省會在啟動時檢查依賴的服務是否可用,不可用時會丟擲異常,防止spring初始化完成。這種情況我們就叫做rpc服務間迴圈依賴。出現了迴圈依賴,必須有一方先啟動。所以這種問題是一定需要解決的。應用間迴圈依賴大致情況如下 a應用呼叫b應用的服務,b應用也會呼叫a應用的服務,無...

spring解決迴圈依賴

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