spring解决循环依赖为什么要用到三级缓存
时间: 2023-10-29 10:43:21 浏览: 158
在 Spring 的循环依赖中,当两个或多个单例 bean 之间相互依赖时,Spring 容器会抛出 BeanCurrentlyInCreationException 异常。这是因为当一个 bean 正在创建时,它依赖的其他 bean 还没有被创建完成,所以 Spring 容器无法完成依赖注入。
为了解决这个问题,Spring 引入了三级缓存机制。三级缓存是 Spring 容器用于解决循环依赖问题的关键。
三级缓存的具体过程如下:
1. 创建 bean 实例,将 bean 放入单例对象缓存中。
2. 将正在创建的 bean 放入当前创建 bean 的缓存中。
3. 对 bean 进行属性注入,注入属性时,如果发现属性依赖于其他 bean,就从单例对象缓存中获取该 bean,并将其放入三级缓存中。
4. 如果发现依赖的 bean 已经在三级缓存中,就直接返回该 bean。
5. 如果依赖的 bean 不在三级缓存中,就继续创建该 bean 并放入三级缓存中。
6. 当 bean 创建完成后,从当前创建 bean 的缓存中移除该 bean。
通过三级缓存机制,Spring 容器可以解决循环依赖问题,保证 bean 可以正确地进行依赖注入。
相关问题
spring boot 怎么处理循环依赖问题的
在Spring Boot中,处理循环依赖问题的机制与Spring Framework是一样的。Spring Boot使用了Spring Framework的依赖注入机制来解决循环依赖问题。具体来说,Spring Boot使用了三级缓存来处理循环依赖问题。
1. 第一级缓存:singletonObjects
这是Spring Bean的默认作用域,它是一级缓存,用于存放已经完成初始化的Bean。当需要获取一个Bean时,Spring会先从singletonObjects缓存中查找,如果能够找到,则直接返回,否则进入下一级缓存。
2. 第二级缓存:earlySingletonObjects
这是二级缓存,用于存放正在创建中的Bean。当一个Bean正在创建中时,它会被存放到earlySingletonObjects缓存中。当依赖注入需要用到这个Bean时,Spring会先从earlySingletonObjects缓存中查找,如果能够找到,则返回,否则进入下一级缓存。
3. 第三级缓存:singletonFactories
这是三级缓存,用于存放创建Bean的工厂方法。当需要创建一个Bean时,Spring会先从singletonFactories缓存中查找,如果能够找到,则使用这个工厂方法创建Bean,并将创建出来的Bean放入earlySingletonObjects缓存中,否则进入下一级缓存。
通过这样的机制,Spring Boot能够在处理循环依赖问题时,保证Bean的正确创建和初始化。当出现循环依赖时,Spring Boot会抛出BeanCurrentlyInCreationException异常,提示开发者需要解决循环依赖问题。
阅读全文