在Spring框架中,三级缓存是用于解决单例bean的循环依赖问题的一种机制。当Spring容器初始化单例bean时,会使用以下三个级别的缓存来管理bean的创建过程,以确保即使存在循环依赖,也能正确实例化并注入bean。这三级缓存分别如下:
1、一级缓存(singletonObjects):
作用: 存储完全初始化好的单例bean实例,即完成了实例化、属性填充、初始化方法调用等所有初始化步骤的bean。
特点: 这是最直接的缓存,一旦bean准备就绪,就会放入此缓存中,后续对该bean的请求直接从此缓存中获取实例。
2、二级缓存(earlySingletonObjects):
作用: 在bean实例化之后,但在完成属性填充和初始化之前,如果检测到循环依赖,会将这个原始的(未完全初始化)bean实例暂存于此。
特点: 此缓存的存在是为了在解决循环依赖时,能够提供一个初步实例给依赖它的其他bean使用,以便继续它们的初始化过程。一旦bean完成全部初始化,这个实例会被移入一级缓存,并从二级缓存中移除。
3、三级缓存(singletonFactories):
作用: 存放的是生产bean实例的ObjectFactory对象,而不是bean实例本身。当一个bean被实例化后,但尚未进行属性填充和初始化,会先创建一个ObjectFactory,并将此factory放入此缓存中。
特点: 这个级别的缓存是为了进一步细化解决循环依赖的策略。当需要提前暴露一个bean的实例(即便它还未完成所有初始化步骤)给依赖它的bean时,会通过调用此factory来获取或创建bean的实例。这样做可以确保即使在循环依赖的情况下,也能按需创建bean实例,同时保持对实例化过程的控制。
通过这三级缓存的配合,Spring能够在处理复杂的依赖关系图时,有效地解决单例bean之间的循环依赖问题,保证每个bean都能被正确地创建和初始化。需要注意的是,非单例(原型)bean由于每次请求都创建新的实例,因此不存在循环依赖问题,也不参与此三级缓存机制。