spring解决循环依赖

2024-02-25  本文已影响0人  九灬日

问题:两个类A和B,A依赖B,B又依赖A,如图

A类 B类

配置:spring.main.allow-circular-references=true

主要处理代码:

     AbstractAutowireCapableBeanFactory.doCreateBean()   

     DefaultSingletonBeanRegistry

解决此问题需要用到DefaultSingletonBeanRegistry中的三个缓存区(都是Map,根据beanName操作)

1、singletonObjects 用来存放完成的Bean(一级缓存区)

2、earlySingletonObjects 用来存放Bean(ObjectFactory.getObject())(二级缓存区)

3、singletonFactories 用来存放Bean(实例化但未初始化)的ObjectFactory(三级缓存区)

流程:

1、首先,通过构造实例化A,包装成ObjectFactory放入singletonFactories;

2、尝试初始化A(处理A的依赖注入),由于没有B实例,同样去实例B,包装成ObjectFactory放入singletonFactories

3、初始化B,从singletonFactories中获取A的ObjectFactory,通过.getObject()方法获取A的实例放入earlySingletonObjects,删除singletonFactories中A的ObjectFactory,将A注入到B来获取完整的B实例,存放到singletonObjects,删除singletonFactories中B的ObjectFactory

4、继续初始化A,将B注入到A,得到完整的A,存放到singletonObjects,删除earlySingletonObjects中的A;

5、至此两个对象创建完成,并都存到了singletonObjects中,之后从容器中获取对象都是从singletonObjects中获取。

上一篇 下一篇

猜你喜欢

热点阅读