设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间12 现在时间12 缓存数据 最初知道八爷还是各种v曲,现在变化真的好大。八爷被越来越多的人喜欢,隐隐有种珍藏心底的东西被发现的难受,新歌这么快就破千了[流泪]这家伙真是太美好了❤️❤️

最初知道八爷还是各种v曲,现在变化真的好大。八爷被越来越多的人喜欢,隐隐有种珍藏心底的东西被发现的难受,新歌这么快就破千了[流泪]这家伙真是太美好了❤️❤️ -- Lemon

查看: 698|回复: 1

spring三级缓存以及为什么不用二级缓存解读

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:234
  • 打卡月天数:0
  • 打卡总奖励:3440
  • 最近打卡:2025-06-26 05:18:23
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
417
主题
368
精华
0
金钱
4673
积分
854
注册时间
2023-1-7
最后登录
2025-6-26

发表于 2025-2-20 03:13:43 | 显示全部楼层 |阅读模式
目录
  • spring三级缓存及为什么不用二级缓存
    • spring是如何使用三级缓存解决循环依赖的呢?
    • 为什么要三级缓存而不是二级?
  • 总结

    spring三级缓存及为什么不用二级缓存

    spring是如何使用三级缓存解决循环依赖的呢?

    首先 我们以下讨论的bean都不是多例的,多例的bean不存在缓存当中,因此spring是无法解决多例bean的循环依赖的。

    我们知道bean的初始化过程分为三步:实例化,依赖注入,初始化。

    首先让我们来看看三级缓存里面各存了些什么:

    • 一级缓存:存放已经完全初始化之后的bean,这也是我们在程序里面拿到的bean
    • 二级缓存:存放实例化完成,但是并没有进行依赖注入和初始化的bean
    • 三级缓存:bean还没有进行实例化,单单保存了bean的创建工厂。

    这种缓存机制能够帮我们解决这样一种循环依赖:A在B之前进行实例化,并且A需要setter注入B,B需构造器注入A(或者属性注入A)。

    注意:

    • 当B获得A的引用时,可以晚一点设置A的属性。
    • 但是B的构造器必须生成,不生成没东西引用,也就是说B一定要获取A,即使A还没设置属性也可以。
    • 如果B在A之前实例化,那么B就会无法引用A,就会直接报错。

    这样在初始化阶段就会进行以下流程:

    1:A要进行初始化,先实例化,先将A的创建工厂放在三级缓存中,然而A在自己的属性注入里面发现B还没有出现,于是先去初始化B

    2:B要进行初始化,先实例化,先把B的创建工厂放在三级缓存种,然后B发现自己的属性注入需要A,去一级找不到A,二级找不到A,在三级找到到了A的创建工厂,于是调用创建工厂的getobject()方法创建一个A的实例化对象(如果A实现了aop,那么就是创建的 A的代理对象),放入二级缓存并且添加入自己的构造器/属性(可以允许A属性晚点设置,但是不能没有),这样B就可以完成自己的初始化,初始化完成之后放入一级缓存并且删掉二三级B缓存

    3:B的初始化完成了,A继续属性赋值,顺利从⼀级缓存拿到实例化且初始化完成的B对象,A对象创建也完成,删除⼆级缓存中的A,同时把A放⼊⼀级缓存

    为什么要三级缓存而不是二级?

    1 避免重复,如果只有1,3两级缓存,那么当A需要BC 而BC都需要A的时候,BC就会同时调用A的创建工厂,生成两份A,导致重复创建

    2 spring希望代理和bean的生命周期要分开,如果一开始就直接调用创建工厂创建bean的话,那么所有拥有aop的bean就会直接进行动态代理,但是spring希望在bean完成初始化之后再生成最终代理。如果不分开的话,也就是说不需要3级缓存,1级存放bean,2级存放实例化后的bean,所有的bean直接调用创建工厂创建并且放在二级缓存,那么也是没问题的。

    采用三级缓存,在这个过程中如果B需要A注入,而A存在代理的话,那么就会生成一个早期的代理对象给B,用于解决循环依赖,而最终的代理对象还是要在beanA完成了属性填充和初始化后再继续进行,这两个生成的代理对象是存在区别的,因此也不算真正破坏到Spring代理在Bean初始化完成后的原则,因为Spring仍然确保了最终的代理对象是在Bean完全初始化后才生成的。

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持晓枫资讯。


    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
    晓枫资讯-科技资讯社区-免责声明
    免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
          1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
          2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
          3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
          4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
          5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
    http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

      离线 

    TA的专栏

    等级头衔

    等級:晓枫资讯-列兵

    在线时间
    0 小时

    积分成就
    威望
    0
    贡献
    0
    主题
    0
    精华
    0
    金钱
    18
    积分
    16
    注册时间
    2022-12-26
    最后登录
    2022-12-26

    发表于 2025-4-2 21:20:45 | 显示全部楼层
    感谢楼主,顶。
    http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
    严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    1楼
    2楼

    手机版|晓枫资讯--科技资讯社区 本站已运行

    CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

    晓枫资讯--科技资讯社区

    本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

    如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表