Spring框架中的三级缓存用于缓存Bean的创建,主要是为了解决循环依赖的问题。三级缓存一共包括singletonFactories、earlySingletonObjects和singletonObjects三个缓存。
singletonFactories缓存:保存了已经创建但是还没有完成初始化的Bean的工厂对象。当需要获取一个Bean时,首先会从该缓存中查找,如果能找到对应的工厂对象,则使用该工厂对象进行创建并返回。
earlySingletonObjects缓存:保存了已经完成初始化但是还没有执行完所有生命周期方法的Bean对象。当一个Bean的初始化方法正在执行时,该Bean会被放入earlySingletonObjects缓存中。当其他Bean需要依赖该Bean时,会从该缓存中获取已经初始化的Bean对象。
singletonObjects缓存:保存了已经完成初始化且执行完所有生命周期方法的Bean对象。当一个Bean的初始化方法执行完成后,会从earlySingletonObjects缓存中移除,并将完成初始化的Bean对象放入singletonObjects缓存中。
使用三级缓存的具体步骤如下:
首先,通过DefaultSingletonBeanRegistry类的getSingleton方法判断是否已经存在该Bean的缓存对象。如果存在,则直接从singletonObjects缓存中获取Bean对象,否则继续下一步。
接着,调用createBean方法创建Bean对象。在创建Bean对象的过程中,会先从singletonFactories缓存中查找是否存在该Bean的工厂对象。如果存在,则使用该工厂对象进行创建,并将创建的Bean对象放入earlySingletonObjects缓存中。
然后,继续执行createBean方法,完成Bean对象的初始化和执行生命周期方法的过程。在该过程中,如果有其他Bean需要依赖该Bean,则会从earlySingletonObjects缓存中获取已经初始化的Bean对象。
最后,将初始化完成的Bean对象放入singletonObjects缓存中,并从earlySingletonObjects缓存中移除。
通过使用三级缓存,Spring框架可以解决循环依赖的问题,并且可以提高Bean的创建和初始化的效率。