说说spring的循环依赖
时间: 2023-10-28 11:46:05 浏览: 74
Spring的循环依赖是指在对象之间存在相互依赖的情况下,如果两个或多个对象相互依赖,就会形成循环依赖,也就是A依赖B,B又依赖A,这种情况下,Spring容器无法完成对象的创建和注入,就会抛出BeanCurrentlyInCreationException异常。
为了解决循环依赖问题,Spring使用了“提前暴露”的方式,即将正在创建的Bean提前暴露给Spring容器,让容器可以提前获取到正在创建的Bean对象。Spring容器通过三级缓存来实现这个过程,即将正在创建的Bean对象放到第三级缓存中,然后再从第三级缓存中获取依赖的Bean。
当Spring容器创建Bean时,如果检测到循环依赖,就会在第一次创建Bean的过程中将Bean放到第一级缓存中,然后从第二级缓存中获取依赖的Bean,完成注入。当依赖的Bean创建完成后,再将依赖的Bean注入到第一级缓存中的Bean,完成整个循环依赖的注入。
需要注意的是,循环依赖只有在单例模式下才会出现,因为在原型模式下,每次都会创建新的对象,不存在依赖的问题。同时,循环依赖也会影响Spring的性能,因此在设计Bean之间的依赖关系时,需要特别注意循环依赖的问题。
相关问题
详细说说 Spring三级缓存是如何解决循环依赖问题的
在Spring中,Bean的创建过程中存在循环依赖问题,即A依赖于B,而B又依赖于A,这时候就需要使用Spring的三级缓存来解决循环依赖问题。
Spring中的三级缓存分别是singletonObjects、earlySingletonObjects和singletonFactories。
1. singletonObjects缓存:存放完全初始化的bean实例。当一个bean需要被注入到另一个bean中时,如果已经存在于singletonObjects缓存中,就可以直接返回这个bean实例。
2. earlySingletonObjects缓存:存放未完全初始化的bean实例。当一个bean需要被注入到另一个bean中时,如果存在于earlySingletonObjects缓存中,就需要先完成这个bean的创建和初始化过程,再返回这个bean实例。
3. singletonFactories缓存:存放创建bean的工厂。当一个bean需要被注入到另一个bean中时,如果不存在于singletonObjects和earlySingletonObjects缓存中,就需要从singletonFactories缓存中获取bean的创建工厂,创建bean实例并放入earlySingletonObjects缓存中,然后完成bean的创建和初始化过程。
通过这三级缓存的机制,Spring可以在bean创建过程中解决循环依赖问题。具体地,当A需要注入到B中,而B又需要注入到A中时,由于A已经存在于singletonObjects缓存中,可以直接返回A的实例;而B还不存在于缓存中,需要从singletonFactories缓存中获取B的创建工厂,但是在创建B的过程中又需要注入A的实例,这时候可以从earlySingletonObjects缓存中获取A的未完全初始化实例,然后完成B的创建和初始化,最后将B放入singletonObjects缓存中。这样就解决了循环依赖的问题。
阅读全文