SpringBean单例情况下解决循环依赖的原理

上一篇 << 下一篇 >>>Spring AOP的底层原理


什么是SpringBean的循环依赖

类A依赖于类B,类B也依赖于类A,这样就构成了循环依赖。

SpringBean单例情况下解决循环依赖的原理_第1张图片

简单解决办法:
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、将完整对象存放到一级缓存中,移除二级和三级缓存信息。

SpringBean单例情况下解决循环依赖的原理_第2张图片

推荐阅读:
<< << << << << << << <<<手动事务和自定义注解事务代码参考
<<

你可能感兴趣的:(SpringBean单例情况下解决循环依赖的原理)