Spring如何解決迴圈依賴

2022-06-29 04:12:09 字數 1844 閱讀 9903

多個bean之間相互依賴,形成了乙個閉環。 比如:a依賴於b、b依賴於c、c依賴於a

通常來說,如果問spring容器內部如何解決迴圈依賴, 一定是指預設的單例bean中,屬性互相引用的場景。也就是說,spring的迴圈依賴,是spring容器注入時候出現的問題。

例項化a -> 將半成品的a放入singletonobjects中->填充a的屬性時發現取不到b->例項化b->從singletonobjects中取出a填充b的屬性->將成品b放入singletonobjects->將b填充到a的屬性中->將成品a放入singletonobjects。

問題:這種基本流程是通的,但是如果在整個流程進行中,有另乙個執行緒要來取a,那麼有可能拿到的只是乙個屬性都為null的半成品a,這樣就會有問題。

a)使用singletonobjects和earlysingletonobjects

成品放在singletonobjects中,半成品放在earlysingletonobjects中

流程可以這樣走:例項化a ->將半成品的a放入earlysingletonobjects中 ->填充a的屬性時發現取不到b->例項化b->將半成品的a放入earlysingletonobjects中->從earlysingletonobjects中取出a填充b的屬性->將成品b放入singletonobjects,並從earlysingletonobjects中刪除b->將b填充到a的屬性中->將成品a放入singletonobjects並刪除earlysingletonobjects。

問題:這樣的流程是執行緒安全的,不過如果a上加個切面(aop),這種做法就沒法滿足需求了,因為earlysingletonobjects中存放的都是原始物件,而我們需要注入的其實是a的**物件

b)使用singletonobjects和singletonfactories

成品放在singletonobjects中,半成品通過singletonfactories來獲取

流程是這樣的:例項化a ->建立a的物件工廠並放入singletonfactories中 ->填充a的屬性時發現取不到b->例項化b->建立b的物件工廠並放入singletonfactories中->從singletonfactories中獲取a的物件工廠並獲取a填充到b中->將成品b放入singletonobjects,並從singletonfactories中刪除b的物件工廠->將b填充到a的屬性中->將成品a放入singletonobjects並刪除a的物件工廠。

問題:這樣的流程也適用於普通的ioc,但如果a上加個切面(aop)的話,這種情況也無法滿足需求,因為每次通過singletonfactories.getobject()獲取的**物件都不同

Spring如何解決迴圈依賴

比如 在a類引入b物件,在b類引入a物件,建立a的時候需要依賴b,建立b的時候需要依賴a,而各自建立物件的時候,其互相依賴的物件還沒有建立完成,就導致各自都無法成功建立物件。這就是迴圈依賴。class aclass b解決迴圈依賴的方法很簡單,如下所示,先例項化a和b,此時都沒初始化,即都沒有對各自...

spring如何解決迴圈依賴

1.構造器注入 無法解決 構造器注入時,a,b都沒有進行初始化物件 構造方法無法執行完成 2.spring 為了解決單例的迴圈依賴問題,使用了 快取。其中一級快取為單例池 singletonobjects 二級快取為提前 物件 earlysingletonobjects 快取為提前 物件工廠 sin...

Spring如何解決迴圈依賴的?

假設有兩個例項a,b迴圈依賴。且作用域都是單例,因為spring只支援單例的迴圈依賴。假設掃瞄到了a,呼叫getbean方法,由於是單例,呼叫getsingleton方法,發現三個緩中都沒有a,進入createbeaninstance的流程。此時建立的是能夠建立a的工廠放進了 快取裡面,然後執行po...