现在有TestA类和TestB类,TestA持有TestB的引用,TestB持有TestA的引用,这就是循环依赖。如果没有Spring,我们又是如何去解决循环依赖呢。
spring解决循环依赖也是如此,首先暴露一个未初始化的实例TestA放到缓存中,创建TestB的实例时,获取的是TestA的未初始化对象,TestB创建完成以后,将TestA进行初始化,由于TestB中TestA的引用和TestA是一样的,TestB中的属性也是完全的初始化的。
Spring的三级缓存,DefaultSingletonBeanRegistry中存在三个Map,用作三级缓存。
(1)一级缓存:singletonObjects ,用于保存BeanName与创建bean实例。
(2)二级缓存:earlySingletonObjects ,用于BeanName与创建bean实例,与singletonObjects 不同的是earlySingletonObjects 中存放的bean是一个未初始化的bean。
(3)三级缓存:singletonFactories ,用于存放BeanName与bean工厂。