【重难点】【Spring 03】循环依赖

【重难点】【Spring 03】循环依赖

一、循环依赖

1.定义

循环依赖的定义很简单,就是 ServiceA 中注入了 ServiceB,ServiceB 中也注入了 ServiceA,Spring 通过三级缓存解决循环依赖的问题

2.Bean 的生命周期

  1. Spring 扫描有注解的 class 得到 BeanDefinition
  2. 根据 BeanDefinition 生成 Bean(根据 class 推断构造方法,使用反射构造原始对象)
  3. 将创建原始对象的 lambda 表达式放入三级缓存中
  4. 对原始对象进行依赖注入
  5. 如果原始对象中的方法需要 AOP,那么还需要生成代理对象放入二级缓存中
  6. 最后把最终生成的对象或者代理对象放入一级缓存中,使用的时候直接从一级缓存中获取

3.三级缓存

  1. 一级缓存:singletonObjects
  2. 二级缓存:earlySingletonObjects
  3. 三级缓存:singletonFactories

三种缓存各自的作用

  • singletonObjects:存放的是已经经历了完整生命周期的 Bean 对象
  • earlySingletonObjects:存放的是原始 Bean 对象,即未经历完整生命周期的 Bean 对象
  • singletonFactories:存放的是创建原始 Bean 对象的 lambda 表达式,也被称为对象工厂

4.解决流程

创建 ServiceA 的第一阶段

  1. 将创建 ServiceA 的 lambda 表达式放到三级缓存中
  2. 在 ServiceA 的原始对象中注入 ServiceB
  3. 我们先尝试在一级缓存中获取 ServiceB,发现一级缓存中没有 ServiceB
  4. 接着去二级缓存中找,发现二级缓存中也没有
  5. 最后我们在三级缓存中也没有找到,这个时候我们就需要创建 ServiceB

创建 ServiceB

  1. 将创建 ServiceB 的 lambda 表达式放到三级缓存中
  2. 在 ServiceB 的原始对象中注入 ServiceA
  3. 我们先尝试在一级缓存中获取 ServiceA,发现一级缓存中没有
  4. 接着去二级缓存中找,发现二级缓存中也没有
  5. 最后我们在三级缓存中找到了,执行 lambda 表达式得到 ServiceA
  6. 然后将 ServiceA 放入二级缓存中,并且注入到 ServiceB 中
  7. 执行三级缓存中的 lambda 表达式,获取 ServiceB
  8. 将 ServiceB 放入一级缓存中
  9. ServiceB 创建完成

创建 ServiceA 的第二阶段

  1. 将创建完成的 ServiceB 注入到 ServiceA 的原始对象中
  2. 将二级缓存中的 ServiceA 放入一级缓冲中
  3. ServiceA 创建完成
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

313YPHU3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值