spring循环依赖以及三级缓存
时间: 2023-10-28 08:55:11 浏览: 77
Spring循环依赖是指两个或多个Bean之间相互依赖,形成了一个闭环,即A依赖B,B又依赖A。这种情况下,Spring容器会出现Bean创建失败的情况。为了解决这个问题,Spring引入了三级缓存机制,即将正在创建的Bean放入缓存中,如果出现循环依赖的情况,从缓存中获取已经创建好的Bean,避免了循环依赖导致的死循环。
相关问题
spring循环依赖的三级缓存
Spring循环依赖的三级缓存是指在实例化Bean的过程中,Spring框架内部维护了三个缓存Map,分别是singletonObjects、earlySingletonObjects和singletonFactories。
1. singletonObjects缓存:存放已经完全初始化的Bean实例,包括在初始化过程中有循环依赖的Bean
2. earlySingletonObjects缓存:存放已经进行了实例化但是还未完成初始化的Bean实例,也包括在初始化过程中有循环依赖的Bean
3. singletonFactories缓存:存放Bean实例的Factory对象,用于解决循环依赖的问题,当需要解决循环依赖时,由Factory对象提供未完成的Bean实例。
通过这三个缓存,Spring框架可以在Bean实例化的过程中解决循环依赖的问题。当Bean A依赖Bean B,同时Bean B也依赖Bean A时,Spring框架会通过缓存机制来避免无限递归的循环依赖。具体流程如下:
1. 当需要实例化Bean A时,Spring框架会先从singletonObjects缓存中查找是否已经存在该Bean实例,如果存在,则直接返回该实例。
2. 如果singletonObjects缓存中不存在Bean A实例,则会从earlySingletonObjects缓存中查找是否存在该实例。如果存在,则将其提供给Factory对象创建Bean A实例并返回。
3. 如果earlySingletonObjects缓存中也不存在Bean A实例,则会从singletonFactories缓存中查找是否存在该实例的Factory对象,如果存在,则使用该Factory对象创建Bean A实例并返回。
4. 如果singletonFactories缓存中也不存在Bean A实例的Factory对象,则需要创建一个新的Factory对象,同时将其存放到singletonFactories缓存中。这个新的Factory对象会提供一个未进行初始化的Bean A实例,同时缓存到earlySingletonObjects中。
5. 当Bean A实例被完全初始化后,会将其从earlySingletonObjects缓存中移动到singletonObjects缓存中,以供其他Bean依赖使用。
通过三级缓存的机制,Spring框架可以解决循环依赖的问题,并在Bean实例化过程中避免无限递归的循环依赖。
spring循环依赖三级缓存
Spring循环依赖的三级缓存是指在创建Bean的过程中,Spring会将正在创建的Bean放入三级缓存中,以便在后续的创建过程中能够快速地获取到该Bean的实例。三级缓存的具体实现细节可以参考Spring的源码。
阅读全文