Spring 为什么要三级缓存,二级缓存不行吗?
创始人
2025-05-29 00:11:05
0

Spring 设计了三级缓存来解决循环依赖问题。

  1. singletonObjects 一级缓存,用于保存实例化、注入、初始化完成的 bean 实例
  2. earlySingletonObjects 二级缓存,用于保存实例化完成、还没依赖注入的 bean 实例
  3. singletonFactories 三级缓存,用于保存 bean 创建工厂,以便于后面扩展有机会创建代理对象。

三级缓存的核心思想,就是把 Bean 的实例化和依赖注入进行分离

举个例子,testService1、testService2 互相依赖,spring 是如何解决循环依赖的:
在这里插入图片描述

图片来自 spring为什么使用三级缓存而不是两级? - 知乎 (zhihu.com)

为什么要三级缓存,二级缓存不行?

其实也行,并不是说二级缓存如果存在aop的话就无法将代理对象注入的问题,本质应该说是初始spring是没有解决循环引用问题的,设计原则是 bean 实例化、属性设置、初始化之后再生成aop对象,但是为了解决循环依赖但又尽量不打破这个设计原则的情况下,使用了存储了函数式接口 ObjectFactory 的第三级缓存。

如果使用二级缓存的话,可以将 AOP 代理工作提前到 提前暴露实例 的阶段执行; 也就是说所有的 bean 在创建过程中就直接生成代理对象;但是这样的话,就和 Spring AOP 的设计原则相驳,AOP 的实现需要与 bean 的正常生命周期的创建分离

比如下面是一个二级缓存,对应三级缓存中的前两级缓存。现在有两个类 A、B 互相依赖,且 B 需要 AOP 代理增强。

步骤:

  1. A 从一级缓存中取不到实例,创建实例 A,添加进二级缓存
  2. A 进行依赖注入,要注入 B
  3. B 从一级缓存中取不到实例,直接创建代理类 B 的实例,添加进二级缓存
  4. 代理 B 进行依赖注入,要注入 A
  5. A 从二级缓存中获取到代理 B,A 依赖注入完成
  6. A 初始化完成,A 添加到一级缓存,删除二级缓存中的 A
  7. 代理 B 从一级缓存中获取到 A,代理 B 依赖注入成功
  8. 代理 B 初始化完成,代理 B 添加到一级缓存,删除二级缓存中的代理 B

在这里插入图片描述

那怎样才能让 AOP 的实现需要与bean的正常生命周期的创建分离?

使用第三级缓存封装一个函数式接口对象到缓存中, 发生循环依赖时,触发代理类的生成。也就是依赖注入前,发现依赖的对象是需要代理增强的,从第三级缓存中获取代理类存入第二级缓存,然后继续完成依赖注入,把代理增强和 bean 生命周期的创建分离开。

还是上面的例子,如果改成三级缓存步骤如下:

  1. A 从一级缓存和二级缓存中取不到实例,创建 A 工厂,添加进三级缓存
  2. A 进行依赖注入,要注入 B
  3. B 从一级缓存和二级缓存中取不到实例,创建 B 工厂,添加进三级缓存
  4. B 进行依赖注入,要注入 A
  5. A 发现要注入的 B 需要代理增强,从三级缓存中获取到 B 工厂,B 工厂创建代理 B 实例,并把 代理 B 存入二级缓存,A 依赖注入完成
  6. A 初始化完成,A 添加到一级缓存,删除二级缓存中的 A 工厂
  7. 代理 B 从一级缓存中获取到 A,代理 B 依赖注入成功
  8. 代理 B 初始化完成,代理 B 添加到一级缓存,删除二级缓存中的代理 B 和 三级缓存中的 B 工厂

当然这都是理论,要验证还需要代码的实践,这位老哥对源码进行了修改,证实了二级缓存下,Spring 的确是可以运行正常。👇
【超级干货】为什么spring一定要弄个三级缓存?

相关内容

热门资讯

安卓系统安装小学教材,安卓系统... 你有没有想过,手机里的安卓系统竟然能装上小学教材呢?没错,你没听错!在这个信息爆炸的时代,科技的发展...
华为安卓系统锁住了,揭秘锁屏背... 最近是不是发现你的华为手机有点儿“顽皮”了?它突然间变得神秘起来,屏幕上那个熟悉的安卓系统仿佛被施了...
安卓电脑改苹果系统,跨越平台的... 你有没有想过,把你的安卓电脑改头换面,变成一个优雅的苹果系统使用者呢?想象那流畅的界面,那独特的触控...
安卓系统怎么按后台,并在任务完... 你有没有遇到过这种情况:手机屏幕一黑,安卓系统就自动进入后台了?是不是觉得有点小郁闷,想要手动切换回...
2021年安卓系统ui,202... 你有没有发现,手机界面最近好像换了个模样?没错,2021年的安卓系统UI可是来了一场大变身呢!今天,...
安卓系统程序编写软件,打造个性... 你有没有想过,手机里的那些神奇应用是怎么诞生的呢?没错,就是那些让你在闲暇时光刷刷视频、在通勤路上玩...
自动开机安卓系统,智能生活新篇... 你有没有想过,当你的安卓手机在清晨的第一缕阳光照耀下自动开机,那种轻松自在的感觉?想象不用再手动解锁...
真我平板x安卓系统,畅享智能生... 亲爱的读者们,你是否也在寻找一款既能满足你对平板电脑的期待,又能让你畅享安卓系统带来的无限乐趣的设备...
恒星安卓系统官网,引领未来智能... 亲爱的读者们,你是否曾好奇过那些闪耀在夜空中的星星,它们是如何在浩瀚的宇宙中熠熠生辉的呢?今天,我要...
u8安卓系统,功能与特色深度解... 你知道吗?在手机操作系统界,有一个小家伙可是相当受欢迎的,它就是U8安卓系统。今天,就让我带你来一探...
花椒安卓系统美颜功能,打造完美... 你有没有发现,现在拍照已经不仅仅是记录生活的工具了,它更是一种艺术创作呢!而在这其中,花椒安卓系统的...
戴尔平板升级安卓系统,畅享安卓... 你有没有发现,戴尔平板最近好像悄悄地来了一次大变身?没错,就是那个我们熟悉的戴尔平板,它现在竟然可以...
安卓助手怎么升级系统,畅享最新... 亲爱的安卓用户们,你是否也和我一样,对安卓系统的升级充满了期待和好奇呢?每次系统升级,都仿佛是给我们...
国产安卓系统的发展,国产安卓系... 你知道吗?在我国科技飞速发展的今天,国产安卓系统可是越来越受到大家的关注呢!它就像一颗冉冉升起的新星...
安卓系统咱们导出电话,轻松备份... 你有没有想过,你的安卓手机里藏着多少珍贵的回忆和重要信息?今天,就让我带你一起探索如何将安卓系统中的...
安卓系统架构设置,构建高效移动... 你有没有想过,你的安卓手机里那些复杂的设置背后,其实隐藏着一个个精心设计的秘密?今天,就让我带你一探...
刷原生安卓系统教程,从入门到精... 亲爱的读者们,你是否对安卓系统充满了好奇,想要亲自体验一下原生安卓的魅力呢?别急,今天我就要手把手教...
原生安卓进入不了系统,系统故障... 最近是不是有不少小伙伴遇到了这样的烦恼:明明手机是原生安卓系统,怎么就进不了系统了呢?别急,今天就来...
安卓子系统开启条件,开启条件全... 你有没有想过,为什么你的安卓手机有时候会突然变得超级流畅,有时候又像是蜗牛爬行?这背后其实有个神秘的...
安卓改苹果系统像素,像素转换的... 你知道吗?最近身边的朋友都在议论纷纷,说他们把安卓手机改成了苹果系统,像素效果简直惊艳到不行!这不,...