spring源碼中的相互依賴問題以及解決辦法

spring在單例的情況下是默認支持循環引用的,在不做任何配置的情況下,兩個bean相互依賴是能初始化成功的;

spring源碼中在創建bean的時候先創建這個bean的對象,創建對象完成之後通過判斷容器對象的allowCircularReferences屬性決定是否允許緩存這個臨時對象,如果能被緩存成功則通過緩存提前暴露這個臨時對象來完成循環依賴;

而這個屬性默認爲true,所以說spring默認支持循環依賴的,但是這個屬性spring提供了api讓碼農進行修改,所以spring也提供了關閉循環引用的功能(setAllowCircularReferences(false));

再就是spring完成這個臨時對象的生命週期的過程中當執行到注入屬性或者自動裝配的週期時候會通過getSingleton方法去得到需要注入的B對象;

而B對象這個時候肯定不存在故而會創建B對象創建B對象成功後繼續B對象的生命週期,當執行到B對象的自動注入週期時候會要求注入A對象;調用getSingleton;

從map緩存中得到A的臨時對象,而且獲取的時候也會判斷是否允許循環引用,但是判斷的這個值是通過參數傳進來的,也就是spring內部調用的,spring源碼當中寫死了爲true,故而如果需要擴展spring、或者對spring二次開發的的時候程序員可以自定義這個值來實現自己的功能;不管放到緩存還是從緩存中取出這個臨時都需要判斷;而這兩次判斷spring源碼當中都是默認爲true;

至此再次說明spring默認是支持循環引用的;

 

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