Bean循环依赖

本文讲述了Java中循环依赖的典型场景,以及在Spring框架中使用@Autowired注解时如何避免循环依赖,涉及Spring的三级缓存(singletonObjects,earlySingletonObjects,singletonFactories)在处理循环依赖过程中的作用。
摘要由CSDN通过智能技术生成

 正常Java中循环依赖场景

    // A依赖了B
    class A {
        B b;
    }
    // B依赖了A
    class B {
        A a;
    }

    // new A(); 时,A中关联的B值为null
    // new B(); 时,B中关联的A值为null

但在Spring中使用@Autowired注解标签进行自动注入时,如不加以处理,就会出现循环依赖的问题:
创建A bean对象 --> 需要注入B bean对象 --> 创建B bean对象 --> 需要注入A bean对象

Spring中如何解决循环依赖问题
Spring内部有三个map存储不同阶段的对象(三级缓存)
一级缓存(singletonObjects):放的是初始化完成的bean
二级缓存(earlySingletonObjects):放的是没有初始化完成的
三级缓存(singletonFactories):放的是用来创建初始化某个bean的工厂对象

 

过程解析:
1.初始化 BeanA,需要注入 BeanB,去查找,BeanB,没有找到,把 BeanA 交给一个工厂对象,将 BeanA 工厂对象存入到三级缓存中。
2.去查找 BeanB,BeanB 不存在,也将 BeanB 交给一个工厂对象,将 BeanB 工厂对象也存入到三级缓存中。
3.由于 BeanB 需要 BeanA,此时可以在第三级缓存中找到 BeanA 工对象,注入给BeanB,然后将 BeanB 放入到二级缓存,从三级缓存中删除 BeanB 工厂对象,注入到 BeanB,完成 BeanB 的初始化,放入到一级缓存。
4.当 BeanB 完成初始化后,将完整的 BeanB 注入到 BeanA 中,完成 BeanA 的初始化。

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值