Spring源码系列03——Spring循环依赖的解决方法

Spring循环依赖的解决方法:

1、三级缓存

一级缓存:private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

二级缓存:private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);

三级缓存:private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

2、提前曝光

流程图

Spring源码系列03——Spring循环依赖的解决方法

问题

1、Spring如何解决循环依赖的?

看图

2、为什么要二级缓存和三级缓存?

二级缓存,是为了避免在A和B,A又和C都存在循环依赖的情况下,多次创建A而设计的。
三级缓存:缓存的是BeanFactory,提供了回调方法getObject,在方法中会判断是否实现了AOP代理,如果没实现,返回普通Bean,实现了则返回AOP增强后的bean实例。

3、Spring有没有解决构造函数的依赖?

没有,调用构造函数时,还没有实例化,没有bean实例,就无法缓存,更谈不上解决依赖。(解决依赖依靠缓存)

Spring有没有解决多实例下的依赖?

没有。多例没有缓存,无法解决。