Spring 循环依赖解决方案(只对 setter 注入有效)

循环依赖

循环依赖是指两个bean对象中的属性通过setter注入,在其实例化的时候当Bean1实例化时,为了给属性Bean2赋值就得要实例化Bean2。而Bean2在实例化时,同时也要为属性Bean1实例化Bean1,这样的话就会陷入一个无限循环了,而这就是Spring中的循环依赖问题。

解决方案:使用三级缓存的方式来解决
在解决 bean循环依赖的思路之前先来复习一下bean的生命周期,其包括的三个步骤:

  • 实例化:执行bean的构造方法,bean中依赖的对象还未赋值
  • 设置属性:给bean中依赖的对象赋值,若被依赖的对象尚未初始化,则先进行该对象的生命周期(递归)。
  • 初始化:执行bean的初始化方法,回调方法等。

循环依赖的解决方法就是在实例化和设置属性之间引入缓存机制,把已经创建好实例但并没有设置属性的bean放到缓存中,缓存中存储的是没有设置属性的实例化对象。其三级缓存如下

级别描述
singletonObjects一级缓存用于存放完全初始化好的 bean,从该缓存中取出的 bean 可以直接使用
earlySingletonObjects二级缓存存放原始的 bean 对象(尚未填充属性),用于解决循环依赖
singletonFactories三级缓存存放 bean 工厂对象,用于解决循环依赖

循环依赖解决过程:
1、先从一级缓存 singletonObjects (一级缓存 )中获取取到则返回
2、如果一级缓存不存在则去二级缓存 earlySingletonObject (二级缓存)中获取得到,
3、如果二级缓存也不存在则去三级缓存 singletonFactories (对象工厂缓存)中创建,并添加到二级缓存中。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值