循环依赖和三级缓存

循环依赖:

        是指一个或多个Bean实例之间存在直接或简介的依赖关系,这种依赖关系构成了环形调用(类与类之间的依赖关系形成了闭环)。

循环依赖的表现形式

 eg1:

        自己依赖自己的直接依赖

       

eg2:

        两个对象之间的直接依赖

eg3:

        多个对象之间的间接依赖

Spirng 框架提供的解决方案:

三级缓存:

                三级缓存,就是用来存放不同类型的Bean

                第一级缓存:用于存放完全初始化的Bean,该Bean可以直接被使用
                第二级缓存:存放原始的Bean的对象,这个Bean里面的属性还没有被赋值,或者没有被依赖注入。

                第三级缓存:存放的是一个Bean工厂对象,用来生成原始的Bean对象,并且放入到耳机缓存中去。

举例:

BeanA 和 BeanB之间存在循环依赖,三级缓存的解决方式

                                             

步骤: 1实例化Bean A,然后把Bean A 包装成一个ObjectFactory对象,保存到三级缓存中去

             2Bean A 开始对Bean A 的成员属性 Bena B开始依赖注入,于是开始了Bean B的初始化,在Bean B初始化时,Bean B会从三级缓存中找到 Bean A,完成 Bean B 自身需求的BeanA的依赖注入,Bean B 初始化成功后就会保存到一级缓存中去。

             3 在Bean B 放入到一级缓存中去后,Bean A 就可以从一级缓存中拿到Bean B 的实例,从而去完成正常的依赖注入。

            核心思想:   

        将Bean的实例化和Bean的属性依赖注入,这两个过程分离开 

Spring 如何解决循环依赖:

        Spring设计了三级缓存来解决循环依赖,一级缓存里面存储完整的Bean实例对象,这些实例时可以被直接使用的。第二级缓存里存储这完成实例化后,但是还没有设置属性值的Bean实例,就是指Bean里面的依赖注入还没有完成。第三级缓存用来存放Bean工厂,它主要用来生产原始的Bean对象,并且放到第二级缓存中去。三级缓存的核心思想就是:"把Bean的实例化和Bean里面的依赖注入进行分离,采用一级缓存存储完整的Bean实例,采用二级缓存存储不完整的Bean实例,通过不完整的实例作为突破口,解决循环依赖的问题。第三级别缓存,主要解决代理对象的循环依赖问题。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值