
spring循环依赖之三级缓存
Spring 三级缓存机制
在 Spring 框架中,三级缓存机制用于优化 Bean 的创建和依赖注入过程。以下是对三级缓存的详细说明及其工作流程。
缓存层次
-
一级缓存(单例池):
- 存储完整的 Bean 实例。
- 直接从这里获取 Bean 是最优的。
-
二级缓存:
- 存储由三级缓存方法生成的 Bean 实例(如果存在 AOP,则存储 Bean 的代理对象)。
- 目的是避免重复创建实例。
-
三级缓存:
- 使用函数式接口存储 Bean 的实例和 Bean 的名称。
- 不会立即调用,而是延迟到需要时再执行。
依赖注入流程示例
假设有两个类 A
和 B
,它们相互引用:
-
获取 Bean A:
- 执行
getBean(A)
,首先检查一级缓存(单例池)。 - 如果一级缓存中没有 A,则进行实例化。
- 在实例化过程中,将 A 的函数式接口存入三级缓存。
- 执行
-
依赖注入 B:
- 在 A 的依赖注入过程中发现需要 B,于是调用
getBean(B)
。 - 检查一级缓存(单例池)中的 B,若没有则实例化 B。
- 将 B 的函数式接口存入三级缓存。
- 在 A 的依赖注入过程中发现需要 B,于是调用
-
依赖注入 A(循环引用):
- 在实例化 B 的过程中,发现需要 A,于是再次调用
getBean(A)
。 - 此时,首先尝试从一级缓存获取 A。
- 如果一级缓存中仍然没有 A,则检查二级缓存。
- 二级缓存为空,接着查看三级缓存。
- 发现三级缓存中有 A 的函数式接口,触发该方法生成 A 的实例。
- 在实例化 B 的过程中,发现需要 A,于是再次调用
-
缓存 A 的实例:
- 将生成的 A 实例缓存到二级缓存中。
- 这样,若 B 和 C 同时依赖 A,且 B 先执行三级缓存,则 A 的实例将被存入二级缓存,C 直接从二级缓存获取 A,避免重复创建。
-
完成依赖注入:
- B 的实例化完成后,将 B 放入一级缓存。
- 返回 A,按照与 B 相同的流程完成 A 的生命周期管理。
总结
Spring 的三级缓存机制通过延迟实例化和缓存实例,优化了 Bean 的创建和依赖注入过程,尤其在处理循环依赖时,避免了重复创建实例,提高了性能和效率。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 王德明
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果