Spring 三级缓存机制

在 Spring 框架中,三级缓存机制用于优化 Bean 的创建和依赖注入过程。以下是对三级缓存的详细说明及其工作流程。

缓存层次

  1. 一级缓存(单例池)

    • 存储完整的 Bean 实例。
    • 直接从这里获取 Bean 是最优的。
  2. 二级缓存

    • 存储由三级缓存方法生成的 Bean 实例(如果存在 AOP,则存储 Bean 的代理对象)。
    • 目的是避免重复创建实例。
  3. 三级缓存

    • 使用函数式接口存储 Bean 的实例和 Bean 的名称。
    • 不会立即调用,而是延迟到需要时再执行。

依赖注入流程示例

假设有两个类 AB,它们相互引用:

  1. 获取 Bean A

    • 执行 getBean(A),首先检查一级缓存(单例池)。
    • 如果一级缓存中没有 A,则进行实例化。
    • 在实例化过程中,将 A 的函数式接口存入三级缓存。
  2. 依赖注入 B

    • 在 A 的依赖注入过程中发现需要 B,于是调用 getBean(B)
    • 检查一级缓存(单例池)中的 B,若没有则实例化 B。
    • 将 B 的函数式接口存入三级缓存。
  3. 依赖注入 A(循环引用)

    • 在实例化 B 的过程中,发现需要 A,于是再次调用 getBean(A)
    • 此时,首先尝试从一级缓存获取 A。
    • 如果一级缓存中仍然没有 A,则检查二级缓存。
    • 二级缓存为空,接着查看三级缓存。
    • 发现三级缓存中有 A 的函数式接口,触发该方法生成 A 的实例。
  4. 缓存 A 的实例

    • 将生成的 A 实例缓存到二级缓存中。
    • 这样,若 B 和 C 同时依赖 A,且 B 先执行三级缓存,则 A 的实例将被存入二级缓存,C 直接从二级缓存获取 A,避免重复创建。
  5. 完成依赖注入

    • B 的实例化完成后,将 B 放入一级缓存。
    • 返回 A,按照与 B 相同的流程完成 A 的生命周期管理。

总结

Spring 的三级缓存机制通过延迟实例化和缓存实例,优化了 Bean 的创建和依赖注入过程,尤其在处理循环依赖时,避免了重复创建实例,提高了性能和效率。