多個bean之間相互依賴,造成了一個閉環。 好比:A依賴於B、B依賴於c、c依賴於Aspring
一般來講,若是問spring容器內部如何解決循環依賴, 必定是指默認的單例Bean中,屬性互相引用的場景。也就是說,Spring的循環依賴,是Spring容器注入時候出現的問題。緩存
實例化A -> 將半成品的A放入singletonObjects中->填充A的屬性時發現取不到B->實例化B->從singletonObjects中取出A填充B的屬性->將成品B放入singletonObjects->將B填充到A的屬性中->將成品A放入singletonObjects。安全
問題:這種基本流程是通的,可是若是在整個流程進行中,有另外一個線程要來取A,那麼有可能拿到的只是一個屬性都爲null的半成品A,這樣就會有問題。併發
成品放在singletonObjects中,半成品放在earlySingletonObjects中spa
流程能夠這樣走:實例化A ->將半成品的A放入earlySingletonObjects中 ->填充A的屬性時發現取不到B->實例化B->將半成品的A放入earlySingletonObjects中->從earlySingletonObjects中取出A填充B的屬性->將成品B放入singletonObjects,並從earlySingletonObjects中刪除B->將B填充到A的屬性中->將成品A放入singletonObjects並刪除earlySingletonObjects。線程
問題:這樣的流程是線程安全的,不過若是A上加個切面(AOP),這種作法就無法知足需求了,由於earlySingletonObjects中存放的都是原始對象,而咱們須要注入的實際上是A的代理對象。代理
成品放在singletonObjects中,半成品經過singletonFactories來獲取對象
流程是這樣的:實例化A ->建立A的對象工廠並放入singletonFactories中 ->填充A的屬性時發現取不到B->實例化B->建立B的對象工廠並放入singletonFactories中->從singletonFactories中獲取A的對象工廠並獲取A填充到B中->將成品B放入singletonObjects,並從singletonFactories中刪除B的對象工廠->將B填充到A的屬性中->將成品A放入singletonObjects並刪除A的對象工廠。blog
問題:這樣的流程也適用於普通的IOC以及有併發的場景,但若是A上加個切面(AOP)的話,這種狀況也沒法知足需求。生命週期