Spring通过三级缓存机制解决单例Bean的循环依赖问题,其中一级缓存(singletonObjects)存放完全初始化的Bean实例,二级缓存(earlySingletonObjects)存放早期引用的Bean实例,三级缓存(singletonFactories)存放用于生成早期引用的ObjectFactory;当Bean A创建过程中依赖Bean B,而Bean B又依赖Bean A时,Spring会将A的ObjectFactory放入三级缓存,B在需要A时通过该工厂获取A的早期引用(可能是代理对象),并将其放入二级缓存供B使用,待B初始化完成后,A继续初始化并最终将完整实例放入一级缓存,从而打破循环依赖;之所以需要三级缓存而非二级,是因为在涉及AOP代理时,若直接将原始对象放入二级缓存会导致B持有的是未代理的实例,而三级缓存的ObjectFactory能按需生成代理后的早期引用,确保AOP功能正确执行;Spring通过singletonsCurrentlyInCreation标识当前正在创建的Bean,当发现某Bean正在创建中又被请求时,即触发从三级缓存获取ObjectFactory并生成早期引用的机制,从而精准判断并解决循环依赖。

Spring框架通过其精妙的三级缓存机制,巧妙且高效地解决了单例Bean之间的循环依赖问题。它并非简单地依靠一次性创建,而是在Bean的生命周期不同阶段,通过暴露不同状态的Bean实例,最终确保所有相互依赖的Bean都能被正确初始化并注入,避免了传统方式下因依赖无法满足而导致的创建死锁。这种设计是Spring底层机制中一个非常值得深入理解的亮点。
Spring解决循环依赖的核心在于其三级缓存的设计与协同工作。这个过程可以概括为:当一个Bean A开始创建,并被实例化后(但尚未完成属性填充和初始化方法调用),它会先将自己包装成一个
ObjectFactory
ObjectFactory
具体来说,这三级缓存分别是:
singletonObjects
earlySingletonObjects
singletonFactories
ObjectFactory
在Spring的单例Bean生命周期管理中,这三层缓存各司其职,共同构筑了一个健壮的循环依赖解决方案。
立即学习“Java免费学习笔记(深入)”;
首先是singletonObjects
接着是earlySingletonObjects
最后,也是最关键的,是singletonFactories
ObjectFactory
ObjectFactory
ObjectFactory
这三者协同工作,构成了一个巧妙的“生产线”。当A需要B,B需要A时,A实例化后,其
ObjectFactory
ObjectFactory
这是一个非常经典的问题,也是理解Spring循环依赖解决机制深度的关键点。答案是:如果仅仅是纯粹的循环依赖(即没有AOP代理),二级缓存确实可以解决问题。但一旦涉及到AOP(面向切面编程),二级缓存就显得力不从心了,这就是三级缓存存在的根本原因。
想象一下这个场景:Bean A依赖Bean B,Bean B依赖Bean A,并且Bean A还需要被AOP代理。
如果只有一级和二级缓存:
earlySingletonObjects
earlySingletonObjects
而三级缓存的引入,正是为了解决这个“AOP代理时机”的问题。三级缓存
singletonFactories
ObjectFactory
当Bean A实例化后,Spring会将其原始对象包装成一个
ObjectFactory
ObjectFactory
当Bean B需要Bean A时,它会从三级缓存中获取到这个
ObjectFactory
getObject()
getObject()
这样一来,Bean B获取到的就是Bean A的“正确”引用——一个可能已经被AOP代理过的对象。当Bean A最终完成所有初始化步骤时,它的一级缓存中的最终实例(也可能是代理对象)会替换掉二级缓存中的早期引用。整个过程中,所有Bean都持有了彼此的正确引用,包括AOP代理后的实例。
所以,三级缓存的真正价值在于它提供了一个“延迟生成AOP代理”的机制,确保了在循环依赖场景下,注入的早期引用是经过AOP处理的(如果需要),从而保证了AOP功能的正确性。没有它,AOP和循环依赖的结合就会出现问题。
Spring在Bean的创建过程中,通过一套严谨的内部状态管理和查找逻辑来判断并触发三级缓存机制,从而解决循环依赖。这个过程主要发生在
DefaultSingletonBeanRegistry
getSingleton()
当Spring尝试获取一个单例Bean时(例如,通过
getBean()
singletonObjects
singletonsCurrentlyInCreation
allowEarlyReference
earlySingletonObjects
singletonFactories
ObjectFactory
ObjectFactory
getObject()
getObject()
ObjectFactory
earlySingletonObjects
singletonFactories
ObjectFactory
这个机制的关键在于
singletonsCurrentlyInCreation
ObjectFactory
以上就是Spring三级缓存详解之循环依赖解决_Java理解Spring框架的底层机制的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号