news 2026/4/30 17:17:42

Bean的三级缓存

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Bean的三级缓存

Spring开发中,Bean A依赖Bean B、Bean B依赖Bean A的「循环依赖」,若不处理会导致容器启动失败。而单例Bean的循环依赖能被优雅解决,核心就是「三级缓存」机制——通过分层存储不同状态的Bean引用,提前暴露未完全初始化的Bean,打破循环死锁。

一、Bean循环依赖的核心分类

循环依赖是Bean依赖形成闭环,Spring对其支持有明确限制,仅单例+Setter/字段注入可通过三级缓存解决:

  • Setter/字段注入(单例):最常见,三级缓存可完美解决。

  • 构造器注入:无法解决,实例化阶段就需依赖,无可用早期引用。

  • 原型作用域:无法解决,原型Bean每次创建新实例,无缓存条件。

二、Bean三级缓存核心解析

三级缓存是DefaultSingletonBeanRegistry类中的三个Map,分层存储不同状态的单例Bean,逐步过渡至完全初始化状态。

缓存级别

源码名称

存储内容

核心作用

一级缓存

singletonObjects

完全初始化的成品Bean

提供可直接使用的单例Bean

二级缓存

earlySingletonObjects

已实例化、未初始化的早期引用

缓存早期引用,提升效率

三级缓存

singletonFactories

生成早期引用的ObjectFactory

解决AOP代理循环依赖,避免AOP失效

缓存流转:三级缓存→二级缓存→一级缓存,Bean初始化完成后存入一级缓存,清理对应二、三级缓存数据。

三、三级缓存解决循环依赖流程

以A、B单例Setter注入循环依赖为例,核心流程如下(需启用循环依赖支持:Spring Boot 2.6+配置spring.main.allow-circular-references=true):

  1. 初始化Bean A:调用构造方法实例化A,将生成A早期引用的工厂存入三级缓存;

  2. A注入B:容器发现A依赖B,触发B的初始化;

  3. 初始化Bean B:实例化B后,将其工厂存入三级缓存,随后B需注入A;

  4. B获取A的早期引用:容器从三级缓存取出A的工厂,生成A的早期引用存入二级缓存,注入B;

  5. B初始化完成:B完成属性注入和初始化,存入一级缓存,注入A;

  6. A初始化完成:A完成注入,存入一级缓存,循环打破。

四、关键总结

1. 三级缓存的核心价值:解决单例+Setter/字段注入的循环依赖,兼顾AOP代理的正确性;

2. 二级缓存无法替代三级缓存:三级缓存的工厂可延迟生成AOP代理对象,避免代理失效;

3. 注意事项:构造器注入、原型Bean的循环依赖无法解决,需避免此类场景或通过手动注入规避。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:12:43

突破Cursor AI限制:解锁Pro功能的终极解决方案

突破Cursor AI限制:解锁Pro功能的终极解决方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial requ…

作者头像 李华
网站建设 2026/4/16 12:12:40

ShardingSphere SQL兼容性实战:避开这些坑让你的分库分表更顺畅

1. 为什么SQL兼容性在分库分表中如此重要? 当你第一次接触分库分表时,可能会觉得这不过就是把数据分散存储而已。但真正开始实施后,你会发现原本运行良好的SQL语句突然就报错了。这就是SQL兼容性问题在作祟。想象一下,你正在用积…

作者头像 李华
网站建设 2026/4/16 12:00:14

《WPF绘图进阶指南》—— 深入解析PathGeometry与路径标记语法

1. 为什么需要PathGeometry? 在WPF中绘制图形时,我们通常会使用Line、Rectangle、Ellipse等基础形状控件。但当我们需要绘制复杂图形时,这些基础控件就显得力不从心了。PathGeometry正是为解决这个问题而生,它允许我们将各种基础线…

作者头像 李华
网站建设 2026/4/16 11:59:26

YimMenu终极指南:如何用开源工具保护你的GTA5在线体验

YimMenu终极指南:如何用开源工具保护你的GTA5在线体验 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimM…

作者头像 李华