3.3 Spring5源码---循环依赖过程中spring读取不完整bean的最终解决方案

根据之前解析的循环依赖的源码, 分析了一级缓存,二级缓存,三级缓存的作用以及如何解决循环依赖的. 然而在多线程的情况下, Spring在创建bean的过程中, 可能会读取到不完整的bean. 下面, 我们就来研究两点: 1. 为什么会读取到不完整的bean. 2. 如何解决读取到不完整bean的问题.

 

和本文相关的spring循环依赖的前两篇博文如下: 

3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖

3.2spring源码系列----循环依赖源码分析

一. 为什么会读取到不完整的bean.

我们知道, 如果spring容器已经加载完了, 那么肯定所有bean都是完整的了, 但如果, spring没有加载完, 在加载的过程中, 构建bean就有可能出现不完整bean的情况

如下所示: 

3.3 Spring5源码---循环依赖过程中spring读取不完整bean的最终解决方案

首先, 有一个线程要去创建A类, 调用getBean(A),他会怎么做呢?

第一步: 调用getSingleton()方法, 去缓存中取数据, 我们发现缓存中啥都没有, 肯定返回null. 

第二步: 将其放入到正在创建集合中,标记当前bean A正在创建

第三步: 实例化bean

第四步: 将bean放到三级缓存中. 定义一个函数接口, 方便后面调用

addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpszxw.html