Skip to content

SpringBoot Bean的循环依赖

循环依赖:指A依赖B,B又依赖A这样的依赖循环问题。在spring中通过DefaultSingletonBeanRegistry的三个对象缓存区解决循环依赖问题:

  • singletonObjects:存储实例化完成且完成依赖注入的Bean。
  • earlySingletonObjects:存储实例化完成但未完成依赖注入的Bean。
  • singletonFactories:存储创建Bean的ObjectFactory。

假设现在有A和B,且A依赖B,B又依赖A,则Bean的创建过程是这样的:

  1. 调用A的构造方法实例化A,此时A还未完成依赖注入,封装一个A的ObjectFactory并放入singletonFactories
  2. 处理A的依赖注入,但此时没有B,则调用B的构造方法实例化B,此时B还未完成依赖注入,封装一个B的ObjectFactory并放入singletonFactories
  3. 处理B的依赖注入,找到singletonFactoriesA的ObjectFactroy,调用该ObjectFactroy的getObject方法得到未完成依赖注入的A(如果需要代理对象,则会自动创建,将来得到的就是代理对象),把A(未完成依赖注入)注入给B,同时把A(未完成依赖注入)放入earlySingletonObjects,将来如果有其他类循环依赖A,则可以直接在earlySingletonObjects中找到,这样singletonFactoriesA的ObjectFactroy就可以删除了。
  4. 至此,B的依赖注入完成,B就创建完毕了,将B的对象放入singletonObjects,同时删除singletonFactoriesB的ObjectFactroy
  5. B创建完毕,继续A的依赖注入,把B注入给A,此时A也创建完毕,就可以删除earlySingletonObjects中的A(未完成依赖注入)。
  6. 至此,A和B的对象都创建完毕且放入singletonObjects中,将来通过容器获取对象都是从singletonObjects中获取。

最近更新:10/11/2024, 5:04:04 AM

原文链接:SpringBoot Bean的循环依赖

|下一篇:SpringBoot Bean生命周期