Spring循环依赖

循环依赖是 spring创建bean的过程中遇到的一种闭环问题,因为完成多个对象的创建必然有先有后,假若两个对象互相依赖,A对象需要注入B对象,B对象需要注入A对象,创建A时B对象还未实例化,如何处理这种如死锁般的问题。

spring使用了多级缓存,当调用createBean创建  A对象时优先从1级缓存寻找,在未找到的情况下会去实例化对象,然后放入更高级的缓存中。

在初始化A的B属性时,也会去调用createBean创建,此时A属于实例化后未初始化的状态,B属于在创建过程中的状态,B完成实例化之后也需要初始化B的A属性,这时候高级缓存中已保存了A对象,虽然这A对象处于实例化未初始化状态,但是已经开辟了内存空间,B对象能拿到A的引用地址。这样B对象既完成了实例化,也完成了初始化,然后放入一级缓存中。

接着回到A对象的B属性赋值阶段,B对象已存在缓存中,A对象从缓存中即可注入B。

当A对象初始化也完成,在beanNames中原本是有 a和b的beanName,到创建B对象时判断缓存中已存在,便不会再重复创建B对象。

你可能感兴趣的:(Spring循环依赖)