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、提前曝光
流程图
问题
1、Spring如何解决循环依赖的?
看图
2、为什么要二级缓存和三级缓存?
二级缓存,是为了避免在A和B,A又和C都存在循环依赖的情况下,多次创建A而设计的。
三级缓存:缓存的是BeanFactory,提供了回调方法getObject,在方法中会判断是否实现了AOP代理,如果没实现,返回普通Bean,实现了则返回AOP增强后的bean实例。
3、Spring有没有解决构造函数的依赖?
没有,调用构造函数时,还没有实例化,没有bean实例,就无法缓存,更谈不上解决依赖。(解决依赖依靠缓存)
Spring有没有解决多实例下的依赖?
没有。多例没有缓存,无法解决。