SpringBean单例情况下解决循环依赖的原理
2021-02-11 本文已影响0人
迦叶_金色的人生_荣耀而又辉煌
上一篇 <<<SpringBean的生命周期流程图
下一篇 >>>Spring AOP的底层原理
什么是SpringBean的循环依赖
类A依赖于类B,类B也依赖于类A,这样就构成了循环依赖。
简单解决办法:
a、set方式明确注入对象
b、将对象设置为单例对象
为什么多例子无法解决Bean循环依赖
因为多例无法判断依赖的是具体哪个bean。
SpringBean单例情况下解决循环依赖的原理
采用了三级缓存原理,一级缓存为完整对象,含有实例及初始化了方法,二级缓存和三级缓存都是婴儿对象,只是完成了实例化,未对方法进行初始化和增强。
A、调用getSingleton方法,先从一级缓存中判断是否存在,不存在并且bean处于创建中,则从二级缓存中获取,如果二级也不存在,则从三级缓存中获取并设置到二级缓存中,移除三级缓存。
B、如果以上对象均为空,则设置状态为创建中
C、调用CreateBean的CreateBeanInstance实例化bean,此时为婴儿对象
D、将婴儿对象加入到三级缓存中
E、设置对象的属性信息,如果有依赖关系,则继续执行A-D的操作。
F、当缓存中获取到依赖bean信息,则继续执行initializeBean进行init方法的初始化及增强操作
G、完整对象获取后,移除当前bean在创建中的状态
H、将完整对象存放到一级缓存中,移除二级和三级缓存信息。
推荐阅读:
<<<Spring IOC的初始化原理
<<<SpringBean的生命周期流程图
<<<Spring AOP的底层原理
<<<Spring AOP通知责任链模式图解
<<<Spring AOP核心源码解读
<<<Spring事务常识汇总
<<<Spring声明事务原理及核心源码分析
<<<手动事务和自定义注解事务代码参考
<<<Spring常用注解汇总