spring的三级缓存

学习的视频为b站图灵的周瑜老师。链接地址为:
https://www.bilibili.com/video/BV1dP411J7tQ?p=6&vd_source=121f285fc763778ca49233ea651d956b

一、看完视频总结的话

在这里插入图片描述

二、循环依赖的解析图

在这里插入图片描述
在这里插入图片描述
除了上面三个map(三级缓存)很重要,还有2个很重要:
1:creatingSet:创建bean的时候,就将对象放入这个数组中
2:()->getEarlyBeanReference(beanName, mdb, bean):判断是否有aop的lambda表达式

> 如果有2个类(Aservice和Bservice2个类)循环依赖,那么spring中解决的方案是三级缓存;什么是三级缓存?

1:创建Aservice的bean,进行属性注入Bsevice,在单例池中没有找到Bservice,则先去创建Bservice,并且将当前没有创建完成,没有放入单例池中的Aservice放入三级缓存(singletonFactories–>singletonFactories<beanName (bean的名称,这里指的是Aservice),
()->getEarlyBeanReference(beanName, mdb, bean)> 这里是放入了验证是否有aop的一个lambda表达式)中,并且在数组creatingSet中标注Aservice正在创建中;
2:创建Bservice的bean,进行属性注入Aservice,Aservice在单例池中没有,并且发现正在创建,则认为Bservice和Aservice产生了循环依赖。Bservice则从二级缓存(earlySingletonObjects)(进行了aop或者没有进行aop的bean对象)中获取Aservice,当前二级缓存没有Aservice 的bean对象,则从三级缓存中获取Aservice的bean对象,发现有,则拿出来,再查看Aservice对象有没有aop,判断依据,先找到Aservice的beanName,再查看放入三级缓存中的 ()->getEarlyBeanReference(beanName, mdb, bean) a:如果有aop,则创建Aservice代理对象,将Aservice代理对象放入二级缓存(earlySingntonObjects) b:如果没有aop,则直接将三级缓存中的bean放入二级缓存。
3:这样Bservice就得到了Aservcie 的bean对象,然后Bservice再进行其他的操作,如属性填充等,最后再加入到单例池中(一级缓存中)
4:如果有第三个类Cservice,并且也跟Aservice进行了循环依赖,那么Cservce创建自己的bean对象之后进行属性注入Aservice,发现Aservice在创建过程中,那么拿取二级缓存earlySigntonObjects,发现里面有(创建Bservice的bean对象过程中,已经将Aservice的代理/普通对象放入二级缓存中了),则直接获取里面的Aservice对象,不进行Aservice的aop创建。
问题:为什么aop创建的对象放入二级缓存,为了防止给Aservice创建多了代理对象
问题:creatingSet在哪一步将对象放入这个数组中,创建每一个bean对象的时候,都会放入这个数组中

三、@Lazy的作用

在这里插入图片描述
加入@Lazy之后,放入spring容器中的就是bService的代理对象。
但是执行bService代理对象里面的方法,实际上还是执行bServcie里面的方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值