小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Spring循環(huán)依賴問題的解決

 小仙女本仙人 2021-04-29

循環(huán)依賴問題

一個bean的創(chuàng)建分為如下步驟:

當創(chuàng)建一個簡單對象的時候,過程如下:

  • 先從單例池中獲取bean,發(fā)現(xiàn)無 a

  • 創(chuàng)建 a 的實例

  • 為 a 賦值

  • 把 a 放到單例池中

當創(chuàng)建一個對象并且其中有另外一個對象是就變成了這樣:

但是當在B對象中由引用了A對象,就會變成這樣:

因為A和B兩者相互引用,但是單例池中始終無法創(chuàng)建任一對象,所以會出現(xiàn)死循環(huán)。

因此,我們需要添加一個半成品池,先把A初始化出來,放到一個半成品池中。

過程如下:

  • 先從單例池中找A對象,沒有則開始創(chuàng)建A對象

  • 實例化A對象,并放入半成品池中

  • 為A對象賦值

  • 賦值時發(fā)現(xiàn)引用了B對象 --> 實例化B對象,并放入半成品池中

  • 為B對象賦值

  • 賦值時發(fā)現(xiàn)引用了A對象,從單例池中和半成品池中找A對象,并將其賦值

  • 實例化B對象,并放入單例池中

  • 實例化A對象,從半成品池中移除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í)行過程如下:

  • 當創(chuàng)建A對象的時候會在工廠池中創(chuàng)建factory(a)

  • ....

  • 當給B賦值時,發(fā)現(xiàn)引用了A,就會去工廠池中執(zhí)行getEarlyReference 提前處理方法,生成一個動態(tài)代理后的A對象,并放入半成品池中,再賦值給B

  • ...

注意: 

當實例化對象A的時候,A對象會產(chǎn)生與之對應的factory(a)方法,只有當某個對象引用A對象時,factory(a)方法才會被執(zhí)行,從而去通過提前引用的方式創(chuàng)建動態(tài)代理對象放入半成品池中

如果說A對象沒有被提前引用,factory(a)方法不會執(zhí)行

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多