 
            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 协议,完整转载请注明来自 王德明
        
     评论
            
                匿名评论
                隐私政策
            
            
                你无需删除空行,直接评论以获取最佳展示效果
            
         
            
         
        
    