一 概述
根据循环依赖问题的流程图可知,当A类中包含B类的对象,B类中包含A类的对象,在对A和B进行创建,实例化以及初始化的时候会出现循环依赖的问题
二 Spring解决循环依赖的方式
Spring是将在A不存在的时候并不会去创建A,而是利用Spring提供的三级缓存来避免出现循环依赖。
三 Spring中解决循环依赖的三级缓存源码分析
三级缓存的源代码
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
//一级缓存
/** Cache of singleton objects: bean name to bean instance. */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
//三级缓存
/** Cache of singleton factories: bean name to ObjectFactory. */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
//二级缓存
/** Cache of early singleton objects: bean name to bean instance. */
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
}
一级缓存中的存储的是完整的对象,二级缓存存放的是非完整的对象。
@FunctionalInterface
public interface ObjectFactory<T> {
/**
* Return an instance (possibly shared or independent)
* of the object managed by this factory.
* @return the resulting instance
* @throws BeansException in case of creation errors
*/
T getObject() throws BeansException;
}
三级缓存的使用是为了通过函数的接口ObjectFactory中的getObject方法方便调用匿名内部类来完成对象整体的步骤。