循环引用过程

  • singletonObjects,单例缓存,存储已经实例化完成的单例。
  • singletonFactories,生产单例的工厂的缓存,存储工厂。
  • earlySingletonObjects,提前暴露的单例缓存,这时候的单例刚刚创建完,但还会注入依赖。

image.gif

image.gif

image.gif

image.gifimage.gifimage.gifimage.gifimage.gifimage.gifimage.gifimage.gifimage.gifimage.gif
SingletonFactories中有,调用ObjectFactory.getObject()获取earlyBean,放入EarlySingletonObject

image.gifimage.gifimage.gifimage.gif

为什么需要三级缓存呢?

三级缓存就是为了解决动态代理类的循环引用问题
三级缓存(SingletonFactories)放入二级缓存(earlySingletonObjects)的时候,会判断是否有SmartInstantiationAwareBeanPostProcessor这样的后置处理器
image.png
而实现这个方法的类主要就一个就是负责动态代理的BeanPostProcessor。
image.png
将ObjectFactory放入SingletonFactories中。(为什么不直接执行ObjectFactory.getObject()放入earlySingletonObjects中呢?【为了代码执行效率】
【好文】Spring 动态代理时是如何解决循环依赖的?为什么要使用三级缓存? - 知乎
image.png

aop代理对象何时放入缓存中的?

image.png
【好文】面试必杀技,讲一讲Spring中的循环依赖_I want to know a little more.-CSDN博客