美团面试:讲解一下三级缓存

Spring框架中的三级缓存主要用于解决循环依赖的问题,并确保在Spring容器中创建单例bean时的线程安全。在Spring框架的Bean生命周期中,三级缓存扮演着非常关键的角色。这里的缓存不是传统意义上的数据缓存,而是Spring用于存储和管理bean创建过程中的对象实例。

什么是循环依赖?

循环依赖指的是两个或多个bean相互依赖对方来完成自己的初始化。例如,Bean A依赖Bean B,而Bean B又依赖Bean A。如果没有适当的处理机制,这种相互依赖会导致Spring容器在初始化这些bean时发生死锁或失败。

Spring的三级缓存

为了解决这种循环依赖问题,Spring提供了一个复杂的缓存机制,通常称为三级缓存。这三级缓存分别是:

  1. 一级缓存(Singleton Objects)

    • 这是主缓存,用于存储完全初始化和准备好的单例bean。当一个bean被完全初始化后,它会从二级和三级缓存移动到这个缓存中。在应用运行期间,当请求一个bean时,Spring首先从这个缓存中查找。
  2. 二级缓存(Early Singleton Objects)

    • 这个缓存存储的是提前暴露的对象,即还没有完全初始化完成的对象。这些对象已经创建了实例,但可能还没有完成依赖注入、初始化方法等。当一个bean正在创建过程中,如果检测到有循环依赖,Spring会将当前部分创建好的bean提前暴露出来,放入这个缓存中,以便其他bean引用。
  3. 三级缓存(Singleton Factories)

    • 这个缓存存储的是对象工厂(ObjectFactory),而不是bean本身。这些工厂负责生成提前暴露的bean。当一个bean第一次被创建并被识别为循环依赖的一部分时,Spring会创建一个工厂对象,将这个工厂对象放入三级缓存。如果其他bean需要依赖这个正在创建的bean,它们可以通过这个工厂来获取对应的提前暴露的bean实例。

工作流程

在bean的创建过程中,如果发生循环依赖,Spring容器会通过这三级缓存来处理:

  1. 当一个bean开始创建时,Spring首先会检查一级缓存,看看所需的bean是否已经完全创建好并缓存了。
  2. 如果没有找到,它会继续检查二级缓存,看看是否有提前暴露的实例。
  3. 如果仍然没有找到,它会查询三级缓存,获取对应的工厂对象,然后通过这个工厂对象创建提前暴露的bean实例,放入二级缓存,并从三级缓存中移除对应的工厂对象。

这个机制确保了即使在存在循环依赖的情况下,Spring也能够正确地管理和创建所有bean,同时保持容器的线程安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值