SpringBoot Bean的循环依赖
循环依赖:指A依赖B,B又依赖A这样的依赖循环问题。在spring中通过DefaultSingletonBeanRegistry
的三个对象缓存区解决循环依赖问题:
singletonObjects
:存储实例化完成且完成依赖注入的Bean。earlySingletonObjects
:存储实例化完成但未完成依赖注入的Bean。singletonFactories
:存储创建Bean的ObjectFactory。
假设现在有A和B,且A依赖B,B又依赖A,则Bean的创建过程是这样的:
- 调用A的构造方法实例化A,此时A还未完成依赖注入,封装一个A的ObjectFactory并放入
singletonFactories
。 - 处理A的依赖注入,但此时没有B,则调用B的构造方法实例化B,此时B还未完成依赖注入,封装一个B的ObjectFactory并放入
singletonFactories
。 - 处理B的依赖注入,找到
singletonFactories
中A的ObjectFactroy,调用该ObjectFactroy的getObject方法得到未完成依赖注入的A(如果需要代理对象,则会自动创建,将来得到的就是代理对象),把A(未完成依赖注入)注入给B,同时把A(未完成依赖注入)放入earlySingletonObjects
,将来如果有其他类循环依赖A,则可以直接在earlySingletonObjects
中找到,这样singletonFactories
中A的ObjectFactroy就可以删除了。 - 至此,B的依赖注入完成,B就创建完毕了,将B的对象放入
singletonObjects
,同时删除singletonFactories
中B的ObjectFactroy。 - B创建完毕,继续A的依赖注入,把B注入给A,此时A也创建完毕,就可以删除
earlySingletonObjects
中的A(未完成依赖注入)。 - 至此,A和B的对象都创建完毕且放入
singletonObjects
中,将来通过容器获取对象都是从singletonObjects
中获取。
最近更新:10/11/2024, 5:04:04 AM
原文链接:SpringBoot Bean的循环依赖
上一篇:SpringBoot启动流程|下一篇:SpringBoot Bean生命周期