循環(huán)依賴問題一個bean的創(chuàng)建分為如下步驟:
當創(chuàng)建一個簡單對象的時候,過程如下:
當創(chuàng)建一個對象并且其中有另外一個對象是就變成了這樣:
但是當在B對象中由引用了A對象,就會變成這樣:
因為A和B兩者相互引用,但是單例池中始終無法創(chuàng)建任一對象,所以會出現(xiàn)死循環(huán)。 因此,我們需要添加一個半成品池,先把A初始化出來,放到一個半成品池中。 過程如下:
這樣就解決了死循環(huán)創(chuàng)建但是當使用了動態(tài)代理后,情況又會有所變化. 先來看一下AOP的執(zhí)行過程,如圖:
在bean的創(chuàng)建過程中,創(chuàng)建動態(tài)代理的時機是在初始化之后的,如圖:
這個時候半成品池里放的是沒有代理過的A對象,當B去半成品池中獲取A對象,獲取的是動態(tài)代理前的A對象,而我們應該獲取的是動態(tài)代理后的A對象,這就會出現(xiàn)問題.
為了解決AOP的問題,spring又加入了一個工廠池
執(zhí)行過程如下:
|
|
|