在Spring框架中,涉及到循环依赖时,为了解决循环依赖问题,使用了三级缓存,其中包括上面提到的二级Map。
具体来说,三级缓存分别是:
-
singletonObjects:
- 保存已经完全初始化的单例Bean实例。
-
earlySingletonObjects:
- 保存尚未完全初始化的单例Bean实例,用于检测循环依赖。
-
singletonFactories:
- 保存用于创建单例Bean的
ObjectFactory
,当检测到循环依赖时,可以通过这个ObjectFactory
创建Bean。
- 保存用于创建单例Bean的
现在来解释一下为什么需要这个二级Map(earlySingletonObjects
):
- 当
BeanFactory
在实例化Bean时,如果发现循环依赖,它会按照以下步骤进行处理:- 如果
singletonObjects
缓存中存在已经完全初始化的Bean实例,直接返回。 - 如果
earlySingletonObjects
缓存中存在尚未完全初始化的Bean实例,说明发生了循环依赖,通过singletonFactories
中保存的ObjectFactory
来创建Bean。 - 在创建Bean的过程中,将尚未完全初始化的Bean实例放入
earlySingletonObjects
缓存。 - 完成Bean的创建和初始化后,将Bean实例从
earlySingletonObjects
缓存移至singletonObjects
缓存。
- 如果
这个二级Map(earlySingletonObjects
)的作用就是用于保存尚未完全初始化的Bean实例,在发生循环依赖的情况下,通过singletonFactories
中保存的ObjectFactory
来创建Bean实例。这样,即使Bean在创建过程中发现了循环依赖,也能够提前暴露尚未完全初始化的Bean实例,从而避免循环依赖导致的问题。
Was this helpful?
0 / 0