spring三级缓存

张开发
2026/4/15 11:27:12 15 分钟阅读

分享文章

spring三级缓存
三级缓存分别是一级缓存初始化后的bean二级缓存bean的早期应用即刚实例化没有依赖注入的bean三级缓存的是bean工厂。假设AB循环依赖A在创建过程中发现需要B转而去创建BB在创建过程中发现需要A此时获取到A的早期引用注入到B中B完成创建后A再注入完整的B从而解决循环依赖。理论上一级二级就能解决循环依赖而第三级是为了处理aop代理的情况。Spring三级缓存详解Spring在DefaultSingletonBeanRegistry中维护了三个缓存用于存储不同阶段的Bean一级缓存singletonObjects存储对象完全初始化好的单例Bean特点Bean已经完成了实例化、属性注入、初始化可以直接使用数据结构MapString, Object二级缓存earlySingletonObjects存储对象提前暴露的早期Bean还未完成属性注入和初始化特点Bean已经实例化但还未进行属性填充和初始化解决的是提前暴露的问题数据结构MapString, Object三级缓存singletonFactories存储对象单例Bean工厂特点存放的是ObjectFactory可以生成早期Bean的引用数据结构MapString, ObjectFactory?工作流程示例假设A依赖BB依赖A创建A实例化A将A的ObjectFactory放入三级缓存填充A发现需要B去创建B创建B实例化B将B的ObjectFactory放入三级缓存填充B发现需要A从三级缓存获取A的ObjectFactory生成A的早期引用放入二级缓存注入到BB完成初始化B初始化完成后放入一级缓存A继续初始化A从一级缓存获取B完成属性注入和初始化放入一级缓存是否还要手动解决循环依赖Spring的三级缓存已经帮我们解决了绝大多数的循环依赖问题日常开发中你不需要手动干预。但在构造器注入、原型Bean等特殊场景下仍然需要注意避免循环依赖的产生。最好的实践是尽量避免循环依赖因为它往往暗示着设计上可能存在一些问题。

更多文章