spring三级缓存总结

2023-11-05

前言

其实说到spring的三级缓存,也是经常被提到,自己也看过对应的源码,但是,总觉得自己还是没有真正的理解,为什么这样说呢,因为每次看到三级缓存相关的技术问题,自己心里感觉还是迷糊的,不知道为什么要有三级缓存,一级缓存不行吗,二级缓存是干啥的,以及和三级缓存的区别等,这些问题自己还是回答不出来,这样的情况其实还是对于知识的一知半解,并且缺乏总结

过程

其实自己在看spring的源码,通过几个功能原理的阅读,自己也有了一定的积累,所以对于三级缓存相关的代码,自己还是知道的,但是对于设计者的思路,自己还是不太清晰,这就需要借助一些相关的文章,看看大佬级别的解读,自己可以从中吸收一些营养。主要有以下两篇文章,写的很好,自己对照着理解以及代码的查阅,确实有了自己的思考和见解,文章链接如下:
https://blog.csdn.net/qq_40277163/article/details/124399551
https://zhuanlan.zhihu.com/p/496273636

整理总结

如果想理解设计的原理,你可以把自己当作spring的设计者,遇到循环依赖的时候,应该怎么解决。

  • 首先,我会这样想,只设计一个缓存是否能解决问题,似乎是可以的,只要一个三级缓存其实就可以,因为三级缓存现状是bean实例化后初始化前的状态,对于一个对象,实例化这个步骤不能少,不然就可能出现空指针的情况,所以三级缓存是必要的。因为这个bean的引用是同一个,所以当出现循环依赖的时候,直接从三级缓存中获取然后就可以继续往下执行了。这样的话,其实就是把一级缓存省略了,因为一级缓存是最终态,相当于三级缓存中的bean在spring容器启动的过程中,一直是个中间态,功能实现其实也能说通。
  • 是不是只要一个三级缓存,就能解决循环依赖问题了?答案是不能,上述我们描述的情况,其实只是spring容器启动的一个场景,就是这个bean不需要被创建代理,没有任何aop的逻辑,一旦这个bean加上了@Cacheable这样的注解,这个bean在spring启动过程中就会被创建代理类来代理接口的实现,在这样的情况下,只要一个三级缓存就解决不了循环依赖的问题。
  • 因为此时这个bean和创建的代理类根本就是两个不一样的对象,比如A依赖B,B依赖C和D,C和D又都依赖A,如果只要一个三级缓存,那么C和D依赖的A最终就不是一个代理类,不符合业务功能,所以就需要一个二级缓存来处理需要创建代理这样的情况。提前走代理类的处理流程,满足代理条件的话,就用代理类来包装bean,让C和D中的依赖是这个bean的代理,然后这个bean可以继续后续的初始化流程,保证其他依赖该bean的注入都是同一个代理类,这个就是二级缓存存在的意义
  • 最后,因为spring的设计者也不确定在bean的创建过程中,需不需要创建代理类,所以他使用三级缓存的设计,实例化之后放入三级缓存,如果在存在循环依赖的时候,提前走创建代理类的逻辑,保证代理类的唯一性,然后存入二级缓存(其实算是懒加载处理),最后初始化完成,放入一级缓存,删除二级和三级缓存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring三级缓存总结 的相关文章

随机推荐

  • html分列代码,科学网—EXCEL 分列 (TextToColumns) 的C#代码 - 丁祥欢的博文

    EXCEL中有一个有用的功能 叫做 分列 顾名思义 EXCEL中将一串文本根据选择的分隔符对文本进行分解 从而产生几列数据 这个功能最常用的地方应该是导入一些文本形式的数据时 特别有用 比如导入CSV格式的数据 举个简单的例子 假设有一行数
  • Eclpise项目如何导入外部jar包

    1 在eclipse项目下建lib文件夹 存放jar包 2 下载所需jar包 拷贝lib文件夹下 解压后的版本 3 重要 设置jar包进项目的classpath 项目名上右击 依次选择 Build Path gt Configure Bui
  • Make NSISW打包异常-cannot call AccessControl::GrantOnFile

    重装电脑系统和NSIS后 使用相同的脚本 无法创建安装包 显示如下错误 Plugin directories C Program Files x86 NSIS Plugins x86 ansi Plugin not found cannot
  • Base64 example

    我们的图片大部分都是可以转换成base64编码的data image 这个在将canvas保存为img的时候尤其有用 虽然除ie外 大部分现代浏览器都已经支持原生的基于base64的encode和decode 例如btoa和atob 将ca
  • Netty的拆包粘包问题

    Netty使用的是TCP IP协议 必然会遇到拆包粘包的问题 Netty也给出了相关的解决方案 记录下Netty如何解决拆包粘包问题 TCP IP协议是 流 协议 就是类似水流一样的数据传输方式 当我们多次请求的时候 就会存在多发送和少发送
  • 从plsql导出ddl到PowerDesigner

    1 plsql导出ddl 工具 导出用户对象 选择需要到处的表 多选框 全部不掉 单选框 选单个文件 导出 2 PowerDesigner导入ddl 快捷键Ctrl R DataBase gt Update Model From Datab
  • Python如何判断输入的字符串是否是int或者float或者字符

    1 题目要求 在上一次猜游戏实验题目的基础上 完善程序 实现如下的功能 系统自动生成 1 100 以内的随机整数 让用户通过键盘输入所猜的数 如果 大于预设的数 显示 遗憾 太大了 小于预设的数 显示 遗憾 太小了 如此循环 直到猜中该数
  • 项目管理java_java项目管理经验总结

    1 谈完钱之后 这件事儿就与钱无关了 大家的一致目标就是把这个活干完 干好 别干到一半的时候跟我提钱太少 活太多的屁话 2 接私活主要是看组员是否有足够的时间 精力 能力来投入这件事情 三者缺一不可 我们之前就经常被坑 3 时刻要记住 钱不
  • mysql数据库修改密码的几种方法

    文章目录 MYSQL修改用户密码 update set grant mysqladmin 在日常使用mysql数据库的时候 我们有修改mysql数据库密码的需求 以下介绍四种修改mysql数据库密码的方法 MYSQL修改用户密码 updat
  • windows触摸板的操作

    一 单指 1 轻触 鼠标左键 2 双击后不松开 长按鼠标左键 这个不太好操作 二 双指 1 轻触 鼠标右键 2 上下滑动 鼠标滑轮 3 双指缩放 网页或图片的大小缩放 三 三指 1 轻触 打开搜索 2 下滑 回到桌面 3 上滑 打开程序管理
  • 点击按钮,QMovie动画播放结束时关闭当前窗口

    点击QToolButtoon弹出一个widget widget上有一个按钮 点击按钮后开始播放动画 当动画播放结束的时候发送finish信号 通知窗口关闭函数去关闭当前窗口 点击按钮播放此动画 直接拖控件完成布局 上代码 main cpp
  • C++11 map实现插入后按value自动排序

    本质上还是使用了map自动按照key进行排序的原理 所以将value放入key中可实现按value排序 include
  • 简单记录vue下单元测试及Mock数据

    1 vue cli 创建一个demo 创建一个 demo vue create demo 在VUE CLI 是有提供测试插件的 所以在构建项目时选择一个测试框架 运行测试脚本 在package json 中可以看到运行测试脚本命令 npm
  • 倾心倾力之作《Qt 5.9 C++开发指南》

    五一假期前收到了人民邮电出版社寄来的书 我们写的 Qt 5 9 C 开发指南 终于印刷出来了 从2016年11月开始写书 到今天终于印刷出版 历时约一年半 现在它终于面世了 成书过程 由于做项目的需要 在2014年开始转而用Qt编写软件 在
  • 301与302区别

    301与302区别 定义如下 301 Moved Permanently 被请求的资源已永久移动到新位置 并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一 如果可能 拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器
  • springboot多模块开发中实现打包

    前言 因为我使用的是idea社区版 所以在创建项目的时候他没有springboot的选项 所以只能创建普通maven项目 创建完成查看项目结构和pom文件 这里我并没有觉得有什么不对劲 所以没管 就去搭建其他模块了 这里就不展示了 后来我需
  • python函数与Lambda表达式

    python函数与Lambda表达式 函数的定义 def functionname parameters 函数 文档字符串 function suite return expression 函数定义的参数为形参 表示表示占据一个参数位置 传
  • Sql Server查询语句

    文章目录 Sql Server查询语句 基础查询 条件查询 模糊查询 Sql Server查询语句 对于Sql Server创建的表中的数据进行查询 可以进行 基础查询 条件查询 模糊查询 基础查询 基础查询语句为 select from
  • 央行数字货币研究所、中国信通院合作立项2项区块链国际标准

    国际电信联盟第十六研究组 简称ITU T SG16 于2021年4月19日至2021年4月30日召开全体会议 来自中国 美国 德国 巴西 西班牙 俄罗斯 瑞士 加拿大 英国 韩国 日本等国家和世界卫生组织等国际组织的百余名代表参加了此次为期
  • spring三级缓存总结

    前言 其实说到spring的三级缓存 也是经常被提到 自己也看过对应的源码 但是 总觉得自己还是没有真正的理解 为什么这样说呢 因为每次看到三级缓存相关的技术问题 自己心里感觉还是迷糊的 不知道为什么要有三级缓存 一级缓存不行吗 二级缓存是