什么是循环依赖

循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。
pAXWc24.png

spring三级缓存

众所周知 一般我们都会将对象交给spring管理,那么对象在spring中是如何存储的呢? 答案是对象存在于spring的map结构中
pAXhsc4.png

等级名称特点
一级缓存singletonObjects初始化完成的对象,可以直接使用
二级缓存earlySingletonObjects提前暴露在缓存中,属性没有填充
三级缓存singletonFactories获取代理对象

对象的创建过程

例如在A,B两个对象的创造过程
pAXWc24.png

  1. 查询缓存
    第一次创造A对象时会先从缓存中查找,如果查找不到则进行创造对象
  2. 创建对象
    java会通过反射创造出 Factory类型的A 并存入三级缓存中。
  3. 填充属性
    由于A对象的属性是B对象,所以A对象的填充属性这一步需要进行B对象的以下几步
    • 查询缓存
    • 创建对象 : 将Factory类型的B放入三级缓存中
    • 填充属性

      由于B对象的属性是A对象,所以这里会进行查询缓存(如果缓存中没有,就是创建对象等一套流程),此时在三级缓存中查到了A,接着将真正的A对象放入二级缓存中,并删除三次缓存中的A,接着将A对象填充到B对象的属性,就完成了B对象的属性填充

    • 初始化 : @PostConstruct就是在这里执行的
    • 缓存转移 : 初始化完成后 删除二,三级缓存中的B,并将B添加到以及缓存中
  4. 初始化
  5. 缓存转移 :初始化完成后 删除二,三级缓存中的A,并将A添加到以及缓存中

pAXh2H1.png