spring三级缓存解决循环依赖面试题
时间: 2024-05-30 18:06:22 浏览: 168
在 Spring 中,循环依赖是指两个或多个 Bean 之间相互依赖,导致无法正确地创建 Bean 实例的情况。为了解决这个问题,Spring 采用了三级缓存机制。
三级缓存是指 Spring 在创建 Bean 实例的过程中,将 Bean 分别放入三个不同的缓存中。具体来说:
1. singletonObjects 缓存:存放已经创建好的单例 Bean 实例。如果两个 Bean 之间发生了循环依赖,那么 Spring 会从 singletonObjects 缓存中查找是否有已经创建好的单例 Bean 实例。
2. earlySingletonObjects 缓存:存放早期暴露出来的单例 Bean 实例。如果两个 Bean 之间发生了循环依赖,那么 Spring 会尝试先将一个 Bean 的早期实例暴露出来,以便另一个 Bean 可以使用它。
3. singletonFactories 缓存:存放 Bean 工厂对象。如果两个 Bean 之间发生了循环依赖,那么 Spring 会尝试先将一个 Bean 的工厂对象放入 singletonFactories 缓存中,以便另一个 Bean 可以使用它。
总体来说,Spring 的三级缓存机制可以在一定程度上解决循环依赖的问题,但如果循环依赖的关系比较复杂,可能会导致缓存的使用效率变低。
相关问题
spring三级缓存面试题
回答: 在Spring中,三级缓存是用来解决循环依赖问题的。一级缓存是singletonObjects,存放完整的Bean对象,可以直接使用。二级缓存是earlySingletonObjects,存放不完整的对象,即已实例化但未初始化的Bean对象,用于解决循环依赖。三级缓存是singletonFactories,存放Bean工厂对象,用于解决循环依赖。[2]
如果去掉二级缓存,假设A依赖B,B依赖A,当实例化B时,发现三级缓存有A的ObjectFactory对象,然后拿到A的实例对象,但多次调用产生的对象肯定是不一样的,所以一定要把A从三级转移到二级缓存中。因此,不能少二级缓存。[1]
如果没有三级缓存,只有一级缓存和二级缓存,是可以的。一级缓存是日常实际获取Bean的地方,二级缓存是还未进行属性注入的Bean对象。[2]
缓存的放置时间和删除时间是在Bean的实例化和初始化过程中进行的。一级缓存存放完整的Bean对象,二级缓存存放不完整的对象,三级缓存存放Bean工厂对象。[3]
阅读全文