Spring中的三级缓存

Spring 中的三级缓存是针对 bean 的加载和创建过程而设计的。在 Spring 容器中,每次请求获取一个 bean 时,Spring 首先检查一级缓存、二级缓存和三级缓存中是否已经存在该 bean,如果存在,则直接返回缓存中的实例对象,否则才进行 bean 的创建。三级缓存包括:

  1. singletonObjects 缓存:一级缓存,也称为“单例池”,用于存储所有单例 bean 的实例对象。当第一次需要获取一个单例 bean 时,Spring 会先检查一级缓存中是否已经存在该 bean 实例,如果存在,则直接返回该实例,否则 Spring 会根据 bean 的定义信息创建一个新的实例,并将其放入一级缓存中。

  2. earlySingletonObjects 缓存:二级缓存,也称为“早期单例对象池”,用于存储正在创建过程中的单例 bean 实例。在单例 bean 的创建过程中,如果发现该 bean 依赖于其他的 bean,则需要先创建该依赖的 bean 实例。此时,Spring 会将该 bean 提前实例化,并将其放入二级缓存中。当依赖的 bean 实例创建完成后,Spring 会将其注入到该 bean 实例中,并从二级缓存中移除。

  3. singletonFactories 缓存:三级缓存,也称为“单例工厂池”,用于存储用于创建单例 bean 的 ObjectFactory。在创建单例 bean 时,如果发现该 bean 依赖于其他的 bean,则需要先创建该依赖的 bean 实例,此时 Spring 会将用于创建该依赖的 ObjectFactory 保存到三级缓存中。当依赖的 bean 实例创建完成后,Spring 会使用该 ObjectFactory 创建该 bean 实例,并从三级缓存中移除。

二级缓存和三级缓存的区别

二级缓存和三级缓存都是用于存储正在创建过程中的单例 bean 实例,它们之间的区别在于:

  1. 存储对象的方式不同:二级缓存中存储的是正在创建的 bean 实例,而三级缓存中存储的是用于创建 bean 实例的 ObjectFactory 对象;
  2. 使用时机不同:二级缓存主要用于处理循环依赖的情况,即当两个或多个 bean 互相依赖,且都是单例时,需要借助二级缓存来解决循环依赖问题;而三级缓存则主要用于处理单例 bean 中存在 prototype 类型依赖的情况,即当一个单例 bean 依赖于一个原型(prototype)bean 时,需要借助三级缓存来创建该依赖项的实例。

虽然二级缓存和三级缓存的实现方式有所不同,但它们都是为了加速 Spring 的单例 bean 创建过程而设计的。通过使用二级缓存和三级缓存,Spring 可以缓存已经创建的单例 bean,避免重复创建,从而提高应用程序的性能。

posted @ 2023-06-10 14:37  永和九年  阅读(3197)  评论(0编辑  收藏  举报