spring解决循环依赖的流程
时间: 2023-12-02 21:34:07 浏览: 84
循环依赖是指两个或多个Bean之间相互依赖的情况,而导致Spring在加载Bean时无法解析这些依赖关系的情况。Spring解决循环依赖的流程主要分为三个步骤:
1. 实例化Bean:首先,Spring会创建一个Bean的半成品,也就是一个空对象。并将该对象缓存到Early Singleton Objects cache中。
2. 填充属性:Spring会开始填充该对象的属性,但是,如果该对象的属性中有引用到其他的Bean,则Spring会暂时将该属性赋值为null,并将该半成品对象缓存到Mid Singleton Objects cache中。
3. 注入其他Bean:Spring会递归注入该半成品对象中的其他属性所引用的Bean。如果在递归注入的过程中,发现有某个Bean需要引用到之前创建的Bean,那么Spring就会直接从Mid Singleton Objects cache中获取该Bean,并将其注入到当前对象中,以完成循环依赖的解决。
最后,当所有的Bean都被填充完毕后,Spring会将这些半成品对象转换为真正的Bean,并将它们缓存到Singleton Objects cache中,供其他的Bean去引用。
相关问题
spring三级缓存解决循环依赖具体流程
Spring的三级缓存是解决循环依赖问题的重要机制,其具体流程如下:
1. 当IOC容器扫描到一个Bean的时候,会先将其实例化出来,并放入一级缓存中,同时会给这个Bean创建一个ObjectFactory对象,用于在后续的依赖注入中提供依赖的实例。
2. 当Spring发现当前Bean需要依赖另一个Bean时,会检查另一个Bean是否已经实例化,如果没有,就递归地调用实例化这个Bean的过程,并将其放入二级缓存中。
3. 如果另一个Bean已经实例化了,但它又依赖当前Bean,那么Spring会从二级缓存中获取这个Bean的ObjectFactory,然后通过ObjectFactory获取这个Bean的实例,并将其注入到当前Bean中。
4. 在注入完成后,当前Bean会被放入三级缓存中,表示当前Bean的所有依赖已经全部注入完成。
5. 最后,当所有Bean都实例化完成后,Spring会从三级缓存中获取Bean,并执行Bean的初始化方法。
总的来说,就是通过三级缓存来实现循环依赖的解决。当Bean依赖的Bean还没有实例化时,会放入二级缓存中,等待后续的注入;当Bean依赖的Bean已经实例化时,会通过ObjectFactory获取实例并完成注入,最终将当前Bean放入三级缓存中,表示依赖注入已经完成。
spring解决循环依赖为什么要用三级缓存,第三级缓存的作用是什么
在Spring容器中,当两个或多个bean之间存在循环依赖时,容器无法通过简单的依赖注入来解决这个问题。为了解决这个问题,Spring使用了三级缓存。
三级缓存的作用是缓存正在创建的bean实例,以避免循环依赖时出现死循环。它是在BeanFactoryPostProcessor的postProcessBeanFactory方法执行前初始化的。这个缓存分为三级:
1. singletonObjects:单例对象缓存,用于缓存已经创建完成的单例bean实例。
2. earlySingletonObjects:早期单例对象缓存,用于缓存正在创建中的单例bean实例。
3. singletonFactories:单例工厂缓存,用于缓存创建单例bean实例的工厂对象。
当容器创建bean时,首先尝试从singletonObjects缓存中获取bean实例。如果找到了,则直接返回。如果没有找到,则尝试从earlySingletonObjects缓存中获取。如果找到了,则说明当前bean正在创建中,此时需要使用singletonFactories缓存中的工厂对象来完成创建,并返回创建好的bean实例。如果都没找到,则需要创建一个新的bean实例,并将其缓存到earlySingletonObjects中,然后再使用singletonFactories缓存中的工厂对象来创建这个bean实例。
在bean创建完成后,Spring会将其缓存到singletonObjects中。这样,在下次需要获取这个bean时,就可以直接从singletonObjects缓存中获取,而不需要再走一遍缓存流程,从而提高了Spring的性能。
阅读全文