• 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 ()->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里面的方法。

  • 相关阅读:
    Rocky Linux 配置邮件发送
    实验八 数据处理与多项式处理(matlab)
    字符串 | 字符串匹配 | KMP算法 | leecode刷题笔记
    Jmeter用于接口测试中,关联如何实现
    C# PictureBox——SizeMode属性
    spring03
    RK3568-buildroot添加用户应用程序
    3dmax如何制作模型走路动画
    深入理解Java类加载机制,再也不用死记硬背了
    pdf转图片(利用pdf2image包)
  • 原文地址:https://blog.csdn.net/M1275601161/article/details/127558018