新闻详情

新闻详情

首页 / 资讯中心 / 详情

彻底搞懂Spring三级缓存:从二级到三级,差的不止是一层缓存

发布时间:2026/9/28 20:44:47来源:尧图网络
彻底搞懂Spring三级缓存:从二级到三级,差的不止是一层缓存
1. IoC与DI基础1.1 什么是IoCIoCInversion of Control将对象的控制权交给 Spring 容器由 Spring 帮你创建和销毁对象。1.2 IoC如何解耦以Computer类需要CPU属性为例方式创建CPU实现类更换实现类手动创建自己new IntelCPU()需要修改代码改为new AMDCPU()IoC方式容器自动寻找并注入只需向容器中注入其他实现类无需改代码IoC 的解耦本质你不需要关心对象怎么创建、用哪个实现类容器帮你搞定。1.3 DI依赖注入DIDependency Injection给对象的属性赋值的过程就是依赖注入。创建Computer对象 → 把CPU对象注入进去 → 属性赋值完成这个过程就是 DI注意因为注入的时候需要判断CPU类型这里Spring区分CPU类型的方法如下1. 先按类型 CPU 找到所有候选intelCPU、amdCPU 2. 如果只有一个直接用 3. 如果有多个依次看 - Qualifier 指定了谁 - 谁被 Primary 标记了 - 字段名/参数名是否等于某个 Bean 名 4. 都不行就报 NoUniqueBeanDefinitionException2. 循环依赖问题当 A 和 B 互相依赖时A 有一个属性是 B → 创建 A 需要给它一个 BB 有一个属性是 A → 创建 B 需要给它一个 A尝试创建 A → 发现需要 B → 尝试创建 B → 发现需要 A →死循环这就是循环依赖问题是 Spring IoC 需要解决的一个核心问题。3. 二级缓存如何解决循环依赖3.1 两级缓存的职责缓存级别存放内容状态一级缓存完全初始化好的 Bean对象创建完成 属性已赋值二级缓存创建好但未初始化的 Bean对象创建完成 属性未赋值3.2 二级缓存解决A-B循环依赖的流程1. 创建A对象new出来属性未赋值→ 放入二级缓存 2. 发现A依赖B → 去创建B对象new出来属性未赋值→ 放入二级缓存 3. 发现B依赖A → 从二级缓存中找到A对象未初始化但已存在 4. B的属性A赋值完成 → B初始化完成 → 放入一级缓存 5. 回过头来A依赖的B已就绪 → 从一级缓存拿到B → 注入给A 6. A的属性B赋值完成 → A初始化完成 → 放入一级缓存二级缓存通过提前暴露未完成初始化的对象打破了循环依赖的死循环。4. 为什么需要三级缓存4.1 核心原因AOP代理Spring 有AOP面向切面编程在 AOP 场景中你拿到的不是对象本身而是代理对象二级缓存只能创建对象本身无法搞定代理对象如果只有二级缓存在 AOP 场景下循环依赖就无法正确解决。4.2 第三级缓存的作用缓存级别存放内容作用一级缓存完全初始化好的 Bean供最终使用二级缓存未初始化的 Bean对象本身或代理提前暴露打破循环三级缓存工厂对象ObjectFactory返回代理对象第三级缓存放的是工厂对象调用时会返回代理对象而非原始对象本身。5. 三级缓存完整流程5.1 A-B循环依赖的三级缓存解决流程1. 创建A对象 → 把A的工厂对象放到三级缓存 2. 发现A依赖B → 创建B对象 → 把B的工厂对象也放到三级缓存 3. 发现B依赖A → 在一、二级缓存中都没找到A 4. 从三级缓存中拿出A的工厂对象 → 工厂对象返回A的代理对象 5. 把A或A的代理放到二级缓存此时A属性未赋值 6. 把A或A的代理注入到B → B属性赋值完成 7. B初始化完成 → 放入一级缓存 8. 回过头来A依赖的B已就绪 → 从一级缓存拿到B → 注入给A 9. A属性赋值完成 → A初始化完成 → 放入一级缓存5.2 关键点三级缓存存的是工厂对象不是 Bean 实例本身工厂对象调用时会判断是否需要代理返回代理对象二级缓存中存放的可能是原始对象或代理对象这样就保证了在 AOP 场景下循环依赖中注入的是代理对象6. 总结对比6.1 二级 vs 三级缓存对比项二级缓存三级缓存能否解决普通循环依赖能能能否解决AOP场景循环依赖不能能第三级缓存存放内容—工厂对象ObjectFactory代理对象支持不支持支持只有二级缓存 A 实例化 - 放原始 a 到二级 - B 注入原始 a - A 初始化后创建代理 aProxy 结果B 拿原始 a容器拿 aProxy不一致 三级缓存 A 实例化 - 放 ObjectFactory 到三级 B 需要 A - 调用 ObjectFactory - getEarlyBeanReference 提前生成代理 aProxy - 放 aProxy 到二级 - B 注入 aProxy A 初始化 - 发现早期引用已是 aProxy - 最终暴露 aProxy 结果B 和容器都是 aProxy一致6.2 三级缓存各自职责缓存名称内容阶段一级singletonObjects完全初始化好的 Bean可直接使用二级earlySingletonObjects未初始化的 Bean可能是代理提前暴露打破循环三级singletonFactories工厂对象ObjectFactory生成代理对象6.3 核心结论二级缓存能解决普通循环依赖但无法解决 AOP 场景下的循环依赖。三级缓存放的是工厂对象能返回代理对象这才是必须使用三级缓存的根本原因。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

动态面板空间杜宾模型:从理论识别到效应分解的完整实战指南 2026/9/28 21:30:25

动态面板空间杜宾模型:从理论识别到效应分解的完整实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
FPGA实战:数字锁相环DPLL原理与Verilog实现详解 2026/9/28 21:30:10

FPGA实战:数字锁相环DPLL原理与Verilog实现详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AWS Strands Harness 开源框架:AI 编程代理成本降低 45% 的架构解析与实操 2026/9/28 21:30:10

AWS Strands Harness 开源框架:AI 编程代理成本降低 45% 的架构解析与实操

1. 这个工具到底在解决什么问题AI 编程代理这个赛道,从 2024 年下半年开始就卷得不像话。Claude Code 和 Codex 这两家几乎占据了绝大多数开发者的日常使用场景,但真正把账单拉出来看的人都知道,按 token 计费的模式在重度使用下有多烧钱。一…

阅读更多 →
Cadence Virtuoso入门:一阶RC低通滤波器设计与仿真全流程解析 2026/9/28 21:29:49

Cadence Virtuoso入门:一阶RC低通滤波器设计与仿真全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Python+KNN手写拼音识别课程设计:图像预处理与分类实战 2026/9/28 21:29:28

Python+KNN手写拼音识别课程设计:图像预处理与分类实战

简介:面向高校机器学习课程设计场景,这份基于Python开发的手写拼音识别资源以KNN(K最近邻)算法为分类核心,覆盖从手写图像输入到拼音类别输出的完整流程。包体包含2589个文件,主体为1649个txt与924个jpg&am…

阅读更多 →
ESP32-C3中GPIO8/GPIO9的I2C硬件直连原理与实战应用 2026/9/28 21:29:22

ESP32-C3中GPIO8/GPIO9的I2C硬件直连原理与实战应用

1. 为什么GPIO8和GPIO9在ESP32-C3-Super-Mini上“不按常理出牌”?刚拿到ESP32-C3-Super-Mini开发板时,我第一反应是——这板子太小了,小到连USB口都得靠Type-C转接线才能插稳。但真正让我停下调试进度、反复翻手册的,不是它的尺寸…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉