Spring循環依賴
03-31
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)來禁用循環引用
推薦閱讀: