Spring循環依賴

Spring容器循環依賴包括構造器循環依賴和setter循環依賴,Spring如何解決循環依賴呢,首先我們先定義循環引用類

在Spring中將循環依賴的處理分成3種情況。

1、構造器循環依賴

表示通過構造器注入構成的循環依賴,此依賴是無法解決的,只能拋出BeanCurrentlyInCreatingException異常表示循環依賴。

如在創建A類時,構造器需要B類,那將去創建B,在創建B類時又發現需要C類,則又去創建C最終在創建C時發現又需要A,從而形成一個環,沒辦法創建。

Spring容器將每一個正在創建的bean標識符放在一個"當前創建bean池"中,bean標識符在創建過程中將一直保持在這個池中,因此如果在創建bean過程中發現自己已經在"當前創建bean池"里時,將拋出BeanCurrentlyInCreatingException異常表示循環依賴;而對於創建完畢的bean將從"當前創建bean池"中清除掉。

以上代碼執行會報錯

2、setter循環依賴

表示通過setter注入方式構成的循環依賴。setter注入方式不同與構造器方式,Spring是先將Bean對象實例化之後再設置對象屬性的。具體步驟如下:

3、prototype範圍的依賴處理

對於prototype作用域bean,Spring容器無法完成依賴注入,因為Spring容器不進行緩存prototype作用域的bean,因此無法提前暴露一個創建中的bean

對於singleton作用域bean,可以通過setAllowCircularReferences(false)來禁用循環引用


推薦閱讀:

張兵:掌握這個賺錢公式,2018年你可以多賺幾百萬

TAG:Spring | 循環 | 依賴 |