什麼是spring循環依賴?spring是如何解決的?

循環依賴有三種情況:構造器循環依賴,setter循環依賴和prototype範圍的循環依賴

1、構造器循環依賴

當使用構造器注入時,也就是使用<constructor-arg>標籤進行注入時,A引用了B,B引用了C,C又引用了A時,這種循環依賴是沒辦法解決的,因爲在A構造器中引用B類時,B類很可能還沒創建完,而B需要用構造器構造並引用C,C又想去引用A,但A卻因爲B,C沒有創建完而遲遲無法結束,這樣將會一直創建下去直到內存不足。

所以spring在這種情況下只能靠拋出異常來解決這個問題,容器會將每一個正在創建的bean標識符放在一個”當前正在創建的bean池“中,當創建一個bean實例時,會先去檢查是否在該池中已經存在一個正在創建中的該bean了,此時就會拋出BeanCurrentlyInCreationException異常來表示循環依賴。

2、setter循環依賴

針對setter注入的情況,因爲可以先直接使用無參構造來構造對象,然後再調用set方法來注入,所以setter注入導致的循環依賴,是可以解決的。

spring針對這種情況,會在對象還未創建完之前提前暴露一個單例工廠方法,從而使其他的bean能夠引用到該bean

3、prototype範圍的循環依賴

protorype作用域的bean,spring是不支持緩存protorype類型的bean的,所以無法提前暴露一個創建中的bean,所以spring對於這種情況依然和1一樣,拋出BeanCurrentlyInCreationException異常來表示循環依賴。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章