Spring的BeanFactory
在处理循环依赖时采用了一种机制,确保在循环依赖的情况下也能够正确地创建Bean实例。这种机制主要涉及到两个阶段:实例化和初始化。
-
实例化阶段:
- 当
BeanFactory
在实例化Bean时,它首先会创建一个尚未初始化的Bean实例,并将其放入缓存中。此时,Bean的属性还没有被注入,因此尚未发生完全的实例化。
- 当
-
初始化阶段:
- 在初始化阶段,
BeanFactory
会继续为Bean注入属性。如果发现循环依赖,Spring会尝试提前暴露尚未完全初始化的Bean实例。
- 在初始化阶段,
-
三级缓存:
- 为了解决循环依赖问题,Spring引入了三级缓存:
- singletonObjects: 保存已经完全初始化的单例Bean实例。
- earlySingletonObjects: 保存尚未完全初始化的单例Bean实例,用于检测循环依赖。
- singletonFactories: 保存用于创建单例Bean的
ObjectFactory
,当检测到循环依赖时,可以通过这个ObjectFactory
创建Bean。
- 为了解决循环依赖问题,Spring引入了三级缓存:
-
处理循环依赖的步骤:
- 当
BeanFactory
在实例化Bean时,如果发现循环依赖,它会按照以下步骤进行处理:- 如果
singletonObjects
缓存中存在已经完全初始化的Bean实例,直接返回。 - 如果
earlySingletonObjects
缓存中存在尚未完全初始化的Bean实例,说明发生了循环依赖,通过singletonFactories
中保存的ObjectFactory
来创建Bean。 - 在创建Bean的过程中,将尚未完全初始化的Bean实例放入
earlySingletonObjects
缓存。 - 完成Bean的创建和初始化后,将Bean实例从
earlySingletonObjects
缓存移至singletonObjects
缓存。
- 如果
- 当
通过这种机制,Spring能够在循环依赖的情况下正确地创建Bean实例,并确保在初始化时得到正确的依赖。但是,为了避免循环依赖导致的问题,最好还是设计避免循环依赖的类结构,或者通过调整Bean的生命周期来解决问题。
Was this helpful?
0 / 0