spring循环依赖三级缓存面试
时间: 2023-11-22 20:06:06 浏览: 77
Spring循环依赖的解决方式是使用三级缓存。当两个Bean相互依赖时,Spring会将其中一个Bean提前暴露出来,然后将其放入三级缓存中。当另一个Bean需要依赖这个Bean时,Spring会从三级缓存中获取已经提前暴露出来的Bean,然后完成依赖注入。
三级缓存的具体实现是通过三个Map来实现的,分别是singletonObjects、earlySingletonObjects和singletonFactories。其中singletonObjects用于存放完全初始化好的单例Bean,earlySingletonObjects用于存放提前暴露出来但还未完全初始化的单例Bean,singletonFactories用于存放创建单例Bean的工厂方法。
在循环依赖的情况下,当一个Bean被创建时,Spring会将其放入singletonFactories中,并将其提前暴露出来放入earlySingletonObjects中。当另一个Bean需要依赖这个Bean时,Spring会从earlySingletonObjects中获取这个Bean,并将其放入singletonObjects中。然后再完成另一个Bean的创建和初始化。
相关问题
spring三级缓存解决循环依赖面试题
在 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]
阅读全文