欢迎光临散文网 会员登陆 & 注册

spring为什么使用三级缓存而不是两级?

2023-07-10 23:38 作者:老友智慧堂  | 我要投稿

Spring 使用三级缓存的主要目的是解决单例Bean的循环依赖问题。当一个单例Bean在被创建的过程中需要引用另一个单例Bean,而这个单例Bean又引用了第一个单例Bean时,如果没有适当的处理机制,就会出现循环依赖的问题。

简单来说,Spring 的三级缓存包括:

  • 一级缓存:singletonObjects,存储已经完全初始化完成的 Bean。

  • 二级缓存:earlySingletonObjects,存储提前暴露出来的、尚未完成初始化的 Bean。

  • 三级缓存:singletonFactories,存储 Bean 工厂对象,用于产生 earlySingletonObjects。

在实例化 Bean 的过程中,Spring 会先检查一级缓存是否有该 Bean,如果没有,再检查二级缓存。如果二级缓存也没有,就会从三级缓存中获取 Bean 工厂对象,然后调用工厂方法创建 Bean 对象,并将其放入二级缓存中。

这种三级缓存机制的优点在于它可以解决循环依赖的问题。例如,当 A 需要 B,B 又需要 A 时,Spring 可以先创建一个还未完成初始化的 A(称为 early A),将其放入二级缓存,然后再创建 B。当创建 B 时,需要 A,此时可以从二级缓存中获取 early A,从而完成 B 的创建。然后再回来完成 A 的创建。

如果只有两级缓存,这种情况就无法处理。当创建 B 需要 A,但是 A 还没有完全创建完成时,就无法从缓存中获取 A,因此 B 的创建无法完成,从而导致整个应用启动失败。这就是为什么 Spring 使用三级缓存而不是两级缓存的原因。


spring为什么使用三级缓存而不是两级?的评论 (共 条)

分享到微博请遵守国家法律