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一定要弄个三级缓存?

相关内容

热门资讯

超凡先锋安卓系统怎么下,打造极... 你有没有听说最近超凡先锋安卓系统火得一塌糊涂?这款系统不仅功能强大,而且操作流畅,简直是安卓界的黑马...
安卓系统吃鸡最佳平板,安卓系统... 你有没有想过,在安卓平板上玩《绝地求生》(也就是大家俗称的“吃鸡”)游戏,竟然也能这么畅快淋漓?没错...
安卓手机换华为系统恢复,系统恢... 你有没有想过,把安卓手机换成华为系统后,那些珍贵的资料和设置怎么恢复呢?别急,今天就来给你详细说说这...
安卓系统手机铃声女生,女生专属... 你有没有发现,现在手机铃声可是女生们展示个性的小秘密呢?那些独特的铃声,仿佛是她们心声的延伸,让人一...
安卓系统选项编程实例,基于安卓... 你有没有想过,你的安卓手机里那些看似简单的系统选项,其实背后隐藏着无限的可能?没错,今天就要带你一探...
安卓谷歌框架系统好用吗,全面解... 你有没有想过,为什么安卓手机那么受欢迎呢?这其中,谷歌框架系统可是功不可没哦!今天,就让我带你来深入...
安卓系统怎么不卡手机,畅享流畅... 手机卡顿真是让人头疼啊!尤其是安卓系统,有时候感觉就像老牛拉破车,慢吞吞的。别急,今天就来给你支几招...
安卓系统卡死代码大全,全面解析... 手机卡死是不是让你头疼得要命?别急,今天就来给你支个招,让你轻松应对安卓系统卡死的问题。咱们先来聊聊...
ios15安卓系统,两大操作系... 你有没有发现,最近手机界可是热闹非凡呢!iOS 15和安卓系统的新版本都纷纷亮相,让人眼花缭乱。今天...
安卓系统怎么上传到平板,安卓系... 你有没有想过,你的安卓手机里那些好玩的应用、照片、视频,怎么就能轻松地搬到平板上呢?今天,就让我来给...
车机安卓系统芯片,引领智能驾驶... 你有没有发现,现在的车机系统越来越智能了?没错,我要跟你聊聊的就是这个车机安卓系统芯片。想象坐在车里...
系统安卓连接app下载,畅享便... 你有没有想过,手机里的那些神奇应用是怎么神奇地连接到你的安卓系统的呢?今天,就让我带你一探究竟,揭开...
奥迪康怎么连接安卓系统,轻松实... 你有没有想过,家里的智能设备越来越多,但有时候连接起来却像是在玩捉迷藏呢?今天,就让我来带你一探究竟...
安卓8.0系统闭源了吗,安卓8... 最近手机圈里可是炸开了锅,大家都在热议一个话题——安卓8.0系统闭源了吗?这可是个大新闻,关系到我们...
小米也是安卓系统的吗,安卓生态... 你有没有想过,那个在手机市场上风生水起的品牌——小米,它的操作系统是不是安卓呢?没错,今天咱们就来聊...
华为安卓系统到多少了,华为安卓... 你有没有注意到,华为的安卓系统又升级啦?没错,就是那个我们每天都离不开的操作系统!今天,就让我带你一...
安卓系统 恢复出厂,恢复出厂设... 手机用久了是不是感觉卡得要命,各种软件堆砌得像个小山?别急,今天就来教你怎么给安卓手机来个“大变身”...
苹果系统不卡安卓会卡,揭秘系统... 你有没有发现,身边的朋友都在争论苹果系统和安卓系统的优劣呢?今天,咱们就来聊聊这个热门话题——为什么...
大厂攻略系统和安卓互通,解锁全... 你有没有想过,那些在大厂工作的朋友们,他们是如何轻松应对各种复杂的工作任务的呢?秘密武器之一,就是那...
苹果刷安卓系统能用吗,可行性探... 你有没有想过,把苹果手机上的应用直接刷到安卓系统上,是不是也能享受到同样的乐趣呢?这可是个让人好奇心...