Spring迴圈依賴問題的解決

2022-06-05 13:54:08 字數 1290 閱讀 8091

乙個bean的建立分為如下步驟:

當建立乙個簡單物件的時候,過程如下:

當建立乙個物件並且其中有另外乙個物件是就變成了這樣:

但是當在b物件中由引用了a物件,就會變成這樣:

因為a和b兩者相互引用,但是單例池中始終無法建立任一物件,所以會出現死迴圈。

因此,我們需要新增乙個半成品池,先把a初始化出來,放到乙個半成品池中。

過程如下:

這樣就解決了死迴圈建立但是當使用了動態**後,情況又會有所變化.

先來看一下aop的執行過程,如圖:

在bean的建立過程中,建立動態**的時機是在初始化之後的,如圖:

這個時候半成品池裡放的是沒有**過的a物件,當b去半成品池中獲取a物件,獲取的是動態**前的a物件,而我們應該獲取的是動態**後的a物件,這就會出現問題.

為了解決aop的問題,spring又加入了乙個工廠池

執行過程如下:

注意:

​ 當例項化物件a的時候,a物件會產生與之對應的factory(a)方法,只有當某個物件引用a物件時,factory(a)方法才會被執行,從而去通過提前引用的方式建立動態**物件放入半成品池中

如果說a物件沒有被提前引用,factory(a)方法不會執行

spring解決迴圈依賴

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

spring解決迴圈依賴

之前面試有被問到過,面試官很調皮,我擅長的點沒有問,然後抽了乙個點讓我回答,這個點考察了原始碼的理解,當時只是大概記得是提前暴露,但是細節答得有些粗糙,特補充一下,protected object getsingleton string beanname,boolean allowearlyrefe...

spring迴圈依賴的解決

當a類中有b屬性,b類中有a屬性的時候,就會產生迴圈依賴。a在例項化的時候,引用了b,但是b麼有例項化,所以就會先例項化b,這個時候發現b又引用了a,但是a還沒有例項化,所以就造成了迴圈依賴。我們來看看spring是如何解決的 public class classa public classa pu...