Spring的三级缓存及其原因

首先看下Spring创建一个bean的基本流程:

创建该实例的原始对象 --> 进行自动装配 --> AOP代理处理 --> 完成bean的创建并加入单例池(即一级缓存)


但是当有循环依赖的时候,Spring是如何解决的呢?

主要原理是利用三级缓存机制:

    singletonObjects: 一级缓存,也就是我们平常理解的单例池。 singletonFactories: 二级缓存,存储的是单例工厂。 earlySingletonObjects: 三级缓存,存储正在创建中的单例对象。

为什么要设立三级缓存呢?

其实当不需要实现AOP的时候,解决循环依赖不用三级缓存机制,也不用单例工厂,二级缓存就足以实现。

    第一级:singletonObjects 第二级:earlySingletonObjects

不需要实现AOP时Spring解决循环依赖基本流程:

假设单例一与单例二相互依赖对方并且此时都没有加入到单例池 1 创建单例一 2 将单例一加入earlySingletonObjects缓存 3 自动装配单例二 4 判断单例二在earlySingletonObjects缓存是否存在 5 不存在则创建单例二<
经验分享 程序员 微信小程序 职场和发展