spring循环依赖解决代码执行梳理

559 阅读1分钟

简介:为学习spring是如何解决循环依赖的,针对4.3.6.RELEASESpring版本进行了调试,按照执行顺序将关键代码行数截图留存

大概流程梳理

Spring循环依赖关键代码位置截图

  • 创建A
  • 实例化A,并将A放入三级缓存,然后填充A的属性b
  • 开始创建B
  • 以下代码均与A创建时一致
  • B实例化,B放入三级缓存,B设置属性a
  • 三级缓存取出A设置给B的属性a,将A设置到二级缓存后再从三级缓存移除A,之后返回至创建B的位置处
  • 返回A设置b属性位置处,继续返回至创建A的位置

关于spring循环依赖常见的几个问题

  • spring解决循环依赖的方式
> 使用三级缓存方式
> 一级缓存:private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
> 二级缓存:private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);
> 三级缓存:private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);
  • spring 解决循环依赖二级缓存是否可以解决

可以

  • spring 为什么使用三级缓存解决循环依赖

三级缓存中,singletonFactories控制穿件实例的方式,这里可以根据需要来创建代理类

  • spring 循环依赖解决是否支持构造器方式

不支持,循环依赖的解决方式主要是通过实例化和初始化分离开来解决的,构造器上来就要直接初始化,如果使用导致栈溢出启动失败