根据之前解析的循环依赖的源码, 分析了一级缓存,二级缓存,三级缓存的作用以及如何解决循环依赖的. 然而在多线程的情况下, Spring在创建bean的过程中, 可能会读取到不完整的bean. 下面, 我们就来研究两点: 1. 为什么会读取到不完整的bean. 2. 如何解决读取到不完整bean的问题.
和本文相关的spring循环依赖的前两篇博文如下:
3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖
3.2spring源码系列----循环依赖源码分析
一. 为什么会读取到不完整的bean.我们知道, 如果spring容器已经加载完了, 那么肯定所有bean都是完整的了, 但如果, spring没有加载完, 在加载的过程中, 构建bean就有可能出现不完整bean的情况
如下所示:
首先, 有一个线程要去创建A类, 调用getBean(A),他会怎么做呢?
第一步: 调用getSingleton()方法, 去缓存中取数据, 我们发现缓存中啥都没有, 肯定返回null.
第二步: 将其放入到正在创建集合中,标记当前bean A正在创建
第三步: 实例化bean
第四步: 将bean放到三级缓存中. 定义一个函数接口, 方便后面调用
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));