问题:两个类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中获取。
网友评论