侧边栏壁纸
  • 累计撰写 116 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

SpringBoot Bean的循环依赖

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的依赖注入,找到 singletonFactories中A的ObjectFactroy,调用该ObjectFactroy的getObject方法得到未完成依赖注入的A(如果需要代理对象,则会自动创建,将来得到的就是代理对象),把A(未完成依赖注入)注入给B,同时把A(未完成依赖注入)放入 earlySingletonObjects,将来如果有其他类循环依赖A,则可以直接在 earlySingletonObjects中找到,这样 singletonFactories中A的ObjectFactroy就可以删除了。
  4. 至此,B的依赖注入完成,B就创建完毕了,将B的对象放入 singletonObjects,同时删除 singletonFactories中B的ObjectFactroy。
  5. B创建完毕,继续A的依赖注入,把B注入给A,此时A也创建完毕,就可以删除 earlySingletonObjects中的A(未完成依赖注入)。
  6. 至此,A和B的对象都创建完毕且放入 singletonObjects中,将来通过容器获取对象都是从 singletonObjects中获取。
博主关闭了所有页面的评论