1. 完全初始化的单例对象缓存(singletonObjects
)
- 功能: 这个缓存用于存储已经完全初始化并可以使用的单例 bean 实例。
- 存储内容: 当一个 bean 完成初始化,包括所有的依赖注入和后处理之后,它会被放入这个缓存中。之后,对该 bean 的请求将直接返回这个缓存中的实例。
2. 早期曝光的单例缓存(earlySingletonObjects
)
- 功能: 这个缓存用于存储那些尚未完成初始化的 bean 实例,主要用于解决循环依赖问题。
- 存储内容: 在 bean 实例化过程中,如果发现需要依赖另一个尚未完成初始化的 bean,Spring 会将当前未完成的 bean 暴露到这个缓存中。这样,其他 bean 可以在构造过程中获取该未完成的实例。
3. 注册的单例缓存(singletonFactories
)
- 功能: 这个缓存保存的是可以用来创建单例对象的工厂方法。
- 存储内容: 当创建单例 bean 时,Spring 会在这个缓存中注册一个
ObjectFactory
,它提供了创建 bean 的能力。这些工厂方法会在 bean 完成初始化后被调用,从而将完整的 bean 实例放入singletonObjects
缓存中。举个例子,循环依赖的处理: -
- 当 Spring 试图创建一个 bean(比如
A
)时,如果它发现需要的依赖(比如B
)还没有完成初始化,它会将正在创建的A
实例暴露到earlySingletonObjects
中。 - 然后,它会在
singletonFactories
中注册一个用于创建A
的工厂方法。
- 当 Spring 试图创建一个 bean(比如