spring三级缓存的流程

请添加图片描述
这是我们的三级缓存的对象
在这里插入图片描述
在这里插入图片描述
这是配置文件中的A和B对象

我们直接进入finishBeanFactoryInitialization的最后一个方法
在这里插入图片描述
就是从这里 spring开始了创建对象的流程
在这里插入图片描述
接下来 我们进入getBean方法中观察它实现了什么
首先调用doGetBean方法 在这里插入图片描述
继续进入 我们见到了一个非常重要的方法
Object sharedInstance = getSingleton(beanName);
它的作用是 从容器中获取bean对象 我们看看它里面是干什么的
在这里插入图片描述
我们从缓存中并没有获取到对象 所以下一步 我们需要创建对象
下面的很多方法 现在暂时不用知道 我们直接看下面的方法
在这里插入图片描述
它调用了我们上面闯入的 return createBean方法
在这里插入图片描述
我们进入查看 再这里面 我们 会找到一个非常重要的类
Object beanInstance = doCreateBean(beanName, mbdToUse, args); 调用doCreateBean方法 获取实例化参数
里面实现了一些 Aware方法以及popilate来注入属性 然后通过反射来初始化bean 具体流程我们就不了解了 我们主要是介绍三级缓存的流程 通过这个方法 我们实现了bean对象的实例化
在这里插入图片描述
自此我们完成 A对象的创建工作 我们接下来完成了一个重要的工作
在这里插入图片描述
接下来调用populateBean方法未bean中填充属性 我们进入populateBean中观察方法
其他的方法暂时不用了解 我们直接看下面的方法
在这里插入图片描述
该方法为我们执行属性的赋值操作 但是注意 此时我们并没有创建B的bean对象 所以 它赋值的不是b对象 而是 一个RuntimeBeanReference 对想 =运行时bean引用
在这里插入图片描述
我们进入Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);
观察它是如何处理的
在这里插入图片描述
此时进入了doGetBean方法中 我们发现 缓存中没有b对象 那么 它就会通过下述方法来创建bean对象
在这里插入图片描述
熟悉的方法 继续进入 它进入doCreateBean中去创建B的bean对象
此时我们发现 它创建号b对象的时候 下一步 存入三级缓存 然后就是又去准备填充b的属性的此时 非常重要
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
!](https://img-blog.csdnimg.cn/e03fc08d8478467a8d74482fa1daca49.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAbTBfNDk3MDgwNjM=,size_20,color_FFFFFF,t_70,g_se,x_16)
将A对象返回
此时获取到了A对象 下图的注释不用太载以 不用关系getObjectForBeanInstance
只知道 刺客我们获取到了 A对象 需要返回给B对象的A属性赋值
在这里插入图片描述
此时我们可以看到 B对象的A属性已经赋值完成 但是a属性里的b属性还没有赋值 此时B的实例化和初始化都已经完成了 接下来该初始化A了
在这里插入图片描述
返回到getSingleton方法的时候 我们发现 它将B对象存入了一级缓存中
在这里插入图片描述
在这里插入图片描述
继续向上返回 我们的给我们的A对象赋值B属性 赋值成功后我们可以看到
在这里插入图片描述
此时已经赋值完成 我们发现已经完成了他们的赋值 整体看上去就像个一个循环一样

继续返回我们发现它将A也放入了1级缓存中
在这里插入图片描述
此时我们的A对象已经创建完成 返回到最初的在这里插入图片描述
然后通过getBean方法去创建B对象
由于B对象在以及缓存中已经存在 所以直接返回我们的循环依赖对象的创建至此已经完成
请添加图片描述
请添加图片描述
写的不好 感谢大佬斧正
一级缓存singletonObjects是完整的bean,它可以被外界任意使用,并且不会有歧义。

二级缓存earlySingletonObjects是不完整的bean,没有完成初始化,它与singletonObjects的分离主要是职责的分离以及边界划分,可以试想一个Map缓存里既有完整可使用的bean,也有不完整的,只能持有引用的bean,在复杂度很高的架构中,很容易出现歧义,并带来一些不可预知的错误。

三级缓存singletonFactories,其职责就是包装一个bean,有回调逻辑,所以它的作用非常清晰,并且只能处于第三层。

在实际使用中,要获取一个bean,先从一级缓存一直查找到三级缓存,缓存bean的时候是从三级到一级的顺序保存,并且缓存bean的过程中,三个缓存都是互斥的,只会保持bean在一个缓存中,而且,最终都会在一级缓存中。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值