Spring中的三级缓存及其原因

本文详细介绍了Spring中解决循环依赖的三级缓存机制:singletonObjects(一级缓存),singletonFactories(二级缓存)和earlySingletonObjects(三级缓存)。通过分析不使用AOP时的二级缓存处理流程和使用AOP时引入三级缓存的原因,阐述了三级缓存在处理循环依赖和确保对象正确代理的重要性。
摘要由CSDN通过智能技术生成

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

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

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

主要原理是利用三级缓存机制:
在这里插入图片描述

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

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

第一级:singletonObjects
第二级:earlySingletonObjects

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

假设单例一与单例二相互依赖对方并且此时都没有加入到单例池
1 创建单例一
2 将单例一加入earlySingletonObjects缓存
3 自动装配单例二
4 判断单例二在earlySingletonObjects缓存是否存在
5 不存在则创建单例二
6 将单例二并且加入earlySingletonObjects缓存
7 自动装配单例一
8 判断单例一在earlySingletonObjects缓存是否存在
9 明显第2步已经加入earlySingletonObje

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值