spring解决循环依赖原理

371 阅读1分钟

概述

在项目中很多对象的属性是循环依赖的,本篇主要是看spring如何解决循环依赖的问题。

缓存池

image.png 在spring容器中有三个map,作为缓存池来使用,spring就是通过这三个map来解决循环依赖的问题。 image.png

循环引用解决流程

  1. 我们假设AB两个Bean相互引用,来看spring如何解决依赖.在spring容器AbstractBeanFactory中的doGetBean里,根据名称获取bean的时候会先尝试从缓存中获取,如果没获取到才创建bean image.png
  2. 缓存查找流程如下图 image.png
  3. 第一次进来的时候肯定在缓存中是找不到A对象的,所以执行创建对象的逻辑,如果创建成功则加入一级缓存 image.png
  4. 先来看创建对象的细节,注意创建之前已经被标记为正在创建,在创建完bean之后,spring会调用一个方法把一个lambda表达式加入到三级缓存中 image.png image.png
  5. 创建完A之后,调用populate方法给A的属性赋值,很自然的找到需要创建B对象.所以Spring开始创建B.前面的逻辑都一样,直到也创建完B之后又来到了B的populate方法给B的属性赋值.发现B中需要A于是又向Spring工厂中想要获取A.这时候开始注意细节!!!! image.png image.png 所以当B再想要注入A的时候,因为A已经被加入了三级缓存,就不会走重新创建A然后又需要创建B的循环依赖过程.至于为什么需要三级缓存而不是用二级缓存,放到AOP章节再进行讨论