ToB企服应用市场:ToB评测及商务社交产业平台

标题: Spring循环依赖+案例解析 [打印本页]

作者: 南飓风    时间: 2024-7-31 11:33
标题: Spring循环依赖+案例解析
什么是Spring中的循环依赖?

循环依赖是指两个或者多个bean互相依赖对方,从而形成一个闭环。比方:Bean A依赖于Bean B,而Bean B又依赖于Bean A。可能会导致Spring在尝试创建这些bean实例时出现问题,由于他们互相等待对方被创建,最终导致应用步伐无法启动。
Spring是如何发现这种循环依赖的问题的呢?

通过依赖图来检测和发现循环依赖问题。如下步骤:
1  Bean的创建过程
Spring容器在启动时,会扫描配置文件(appliactionContext.xml)或者注解定义的bean,并且尝试创建这些bean的实例。创建bean实例的过程如下
2 依赖注入过程
在属性填充阶段,Spring会为每个bean注入他所依赖的bean。在这个过程中,Spring会跟踪哪些bean正在被创建,以便检测循环依赖。
3 循环依赖检测机制
Spring通过一个名为“DefaultSingletonBeanRegistry”的类来跟踪单例bean的创建状态。该类维护了三个重要的缓存来管理bean的创建过程。
具体的检测步骤

实例化阶段

当Spring开始实例化一个bean时,它会将这个bean标记为正在创建。这一步是通过将bean名称添加到一个“正在创建中的bean”集合(‘singletonCurrentlyInCreaontion’)中来实现的。
属性填充阶段

在属性填充阶段,Sping会为该bean注入其依赖的其他的bean。此时Spring会检查这个“其他的bean”是否已经在创建过程中。
举例

如Bean A和Bean B循环依赖
  1. @Component
  2. public class A {
  3.     @Autowired
  4.     private B b;
  5.     public A() {
  6.         System.out.println("A is created");
  7.     }
  8. }
  9. @Component
  10. public class B {
  11.     @Autowired
  12.     private A a;
  13.     public B() {
  14.         System.out.println("B is created");
  15.     }
  16. }
复制代码
Spring的依赖注入过程:
1 实例化Bean A
2 填充Bean A的属性
3 填充Bean B的属性
4 完成Bean B的创建
5 回到Bean A的创建

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4