Spring解决循环依赖

284 阅读1分钟

概念:现在如果有个A对象,他的属性是B对象,而B对象的属性也是A对象,也就是A依赖B,而B又依赖A。

大致过程:

(1)A对象实例化,然后对属性进行注入.
(2)发现依赖B对象,但这个时候B对象还没又被创建出来,所以转头去实例化B对象;
(3)B对象实例化之后,发现需要依赖A对象,A对象已经实例化了,B对象能完成创建
(4)B对象返回到A对象的属性注入的方法上,最终A对象完成创建.

原理:三级缓存

三级缓存实际上就是三个map:
(1) singletonObject(一级缓存,日常实际获取Bean的地方)
(2) earlySingletonObjects(二级缓存,还没进行属性注入,由三级缓存放入)
(3) singletonFactories(三级缓存,Value是一个对象工厂)

image.png

回到上述的大致过程:
(1)A对象实例化之后,属性注入之前,其实会把A对象放入三级缓存中,Key是BeanName,Value是ObjectFactory
(2)等到A对象属性注入的时候,发现依赖B,又去实例化B时,B对象属性注入就需要获取A对象,这里就是从三级缓存中拿出ObjectFactory,从ObjectFactory中得到对应的Bean(就是对象A)
(3)再把三级缓存中的A记录删除,将其放入二级缓存中,二级缓存中的Key是BeanName,Value是Bean(这里的Bean还没有完成属性注入相关的工作)
(4)等到完成初始化之后,就会把二级缓存的内容删除,放入一级缓存中
(5)去getBean的时候实际上拿到的就是一级缓存中的