Spring — 三级缓存和 循环依赖

置顶

学习专栏:【Java后端面试题】

  • 1.Java面试题—基础知识、面向对象、【容器】、IO & 【设计模式】、泛型 & 异常 & 反射 & 注解、快速排序
  • 2.Java面试题—并发基础、【同步 & 互斥】、JUC & 并发容器、【线程池】、异步编程、【Lambda表达式】、方法引用、Stream流
  • 3.Java面试题—JVM基础、【内存管理】、【垃圾回收】 & 垃圾收集器、JVM 调优
  • 4.Java面试题—【Spring】、【Spring Boot】、Spring Cloud、Mybatis-Plus
  • 5.Java面试题—【MySQL】、【Redis】、【计算机网络】、Linux、【Nginx】

1.三级缓存 & 循环依赖

Spring中的 三级缓存 是为了解决 循环依赖 问题而设计的。循环依赖 是指在一个Bean的创建过程中,依赖了另一个Bean,而这个被依赖的Bean又依赖了第一个Bean,形成了依赖循环。

  • 第一级缓存:存放已经经历了完整生命周期的Bean对象,这些对象可以直接使用。
  • 第二级缓存:存放早期暴露出来的单例Bean对象。这些对象已经实例化,但可能还没有完成属性填充。这个缓存主要用于解决循环依赖问题。
  • 第三级缓存:存放早期暴露的单例Bean的工厂对象。这个缓存也是用于解决循环依赖问题,特别是在AOP的场景下。

2.解决 循环依赖 的 步骤

解决 循环依赖 的 步骤如下:

    1. 在解决 循环依赖 问题时,Spring会首先尝试从 第一级缓存 中获取已经 创建好的Bean对象
    1. 如果没有找到,就会去 第二级缓存 中获取早期暴露的单例对象。
    1. 如果还是没有找到,就会去 第三级缓存 中获取早期暴露的 单例对象的工厂,然后通过这个工厂来创建 Bean对象。创建好的Bean对象会被放入 第一级缓存 中,以便后续使用。

需要注意的是,只有 单例的Bean 才会通过 三级缓存 提前暴露来解决 循环依赖 问题。非单例的Bean每次使用都会从容器中创建新对象,所以不会将其放到三级缓存中。

此外,为了解决 第二级缓存AOP生成新对象 的问题,Spring会提前执行AOP,获取增强以后的对象,这样依赖的对象就是增强以后的对象了。

总的来说,Spring的三级缓存机制是为了解决循环依赖问题而设计的,通过提前暴露单例对象和创建对象工厂的方式来避免循环依赖产生的问题。


------ 感谢观看,一键三连 ------

你可能感兴趣的:(NoteBook笔记本,spring,java,原理)