从源码角度,带你研究什么是三级缓存腾讯云开发者社区

二级缓存中存的是半成品,用来解决对象创建过程中的循环依赖问题

三级缓存中存的是ObjectFactory<>类型的lambda表达式,用于处理存在AOP时的循环依赖问题

三级缓存的顺序是由查询循序而来,与在类中的定义顺序无关

所以第一级缓存:singletonObjects,第二级缓存:earlySingletonObjects,第三级缓存:singletonFactories

接口注入的方式太灵活,易用性比较差,所以并未广泛应用起来,大家知道有这么一说就好,不要去细扣了

构造方法注入的方式,将实例化与初始化并在一起完成,能够快速创建一个可直接使用的对象,但它没法处理循环依赖的问题,了解就好

setter方法注入的方式,是在对象实例化完成之后,再通过反射调用对象的setter方法完成属性的赋值,能够处理循环依赖的问题,是后文的基石,必须要熟悉

先创建的是Circle对象,那么我们就从创建它的populateBean开始,再开始之前,我们先看看三级缓存中的数据情况

此时三级缓存中的数据没有变化,但是SetsingletonsCurrentlyInCreation中多了个loop标识loop正在创建中

loop实例化完成之后,对其属性circle进行填充,去Spring中获取circle对象,又来到了熟悉的doGetBean

此时一、二级缓存(singletonObjects``earlySingletonObjects)中都没有circle、loop,而三级缓存中有这两个

通过getSingleton获取circle时,三级缓存调用了getEarlyBeanReference,但由于没有AOP,所以getEarlyBeanReference直接返回了普通的半成品circle

然后将半成品circle放到了二级缓存,并将其返回,然后填充到了loop对象中

此时的loop对象就是一个成品对象了;接着将loop对象返回,填充到circle对象中,如下如所示

我们发现直接将成品loop放到了一级缓存中,二级缓存自始至终都没有过loop,三级缓存虽说存了loop,但没用到就直接remove了

此时缓存中的数据,相信大家都能想到了

比上一种情况多了AOP,我们来看看对象的创建过程有什么不一样;同样是先创建Circle,在创建Loop

创建过程与上一种情况大体一样,只是有小部分区别,跟源码的时候我会在这些区别上有所停顿,其他的会跳过,大家要仔细看

实例化Circle,然后填充半成品circle的属性loop,去Spring容器中获取loop对象,发现没有

则实例化Loop,接着填充半成品loop的属性circle,去Spring容器中获取circle对象

这个过程与前一种情况是一致的,就直接跳过了,此时三级缓存中的数据如下:

将半成品circle的代理对象放到了第二级缓存中,并将代理对象返回赋值给了半成品loop的circle属性

注意:此时是在进行loop的初始化,但却把半成品circle的代理对象提前创建出来了

loop的初始化还未完成,我们接着往下看,又是一个重点,仔细看

在initializeBean方法中完成了半成品loop的初始化,并在最后创建了loop成品的代理对象

loop代理对象创建完成之后会将其放入到第一级缓存中(移除第三级缓存中的loop,第二级缓存自始至终都没有loop)

然后将loop代理对象返回并赋值给半成品circle的属性loop,接着进行半成品circle的initializeBean

因为circle的代理对象已经生成过了(在第二级缓存中),所以不用再生成代理对象了;将第二级缓存中的circle代理对象移到第一级缓存中,并返回该代理对象

此时各级缓存中的数据情况如下(普通circle、loop对象在各自代理对象的target中)

MapsingletonObjects有circle代理对象有loop代理对象MapearlySingletonObjects无circle无loop对象Map>singletonFactories无circle无loop对象SetsingletonsCurrentlyInCreation无circle无loop我们回顾下这种情况下各级缓存的存在感,一级缓存仍是存在感十足,二级缓存有存在感,三级缓存挺有存在感

第三级缓存提前创建circle代理对象,不提前创建则只能给loop对象的属性circle赋值成半成品circle,那么loop对象中的circle对象就无AOP增强功能了

第二级缓存用于存放circle代理,用于解决循环依赖;也许在这个示例体现的不够明显,因为依赖比较简单,依赖稍复杂一些,就能感受到了第一级缓存存放的是对外暴露的对象,可能是代理对象,也可能是普通对象

所以此种情况下:三级缓存一个都不能少

循环依赖+AOP这种情况中,circle代理对象的生成提前了,因为必须要保证其AOP功能,但loop代理对象的生成还是遵循的Spring的原则

如果我们打破这个原则,将代理对象的创建逻辑提前,那是不是就可以不用三级缓存了,而只用两级缓存了呢?

去除了第三级缓存,并将代理对象的创建逻辑提前,置于实例化之后,初始化之前;

1、三级缓存各自的作用

第一级缓存存的是对外暴露的对象,也就是我们应用需要用到的

第二级缓存的作用是为了处理循环依赖的对象创建问题,里面存的是半成品对象或半成品对象的代理对象

第三级缓存的作用处理存在AOP+循环依赖的对象创建问题,能将代理对象提前创建

2、Spring为什么要引入第三级缓存

严格来讲,第三级缓存并非缺它不可,因为可以提前创建代理对象

提前创建代理对象只是会节省那么一丢丢内存空间,并不会带来性能上的提升,但是会破环Spring的设计原则

Spring的设计原则是尽可能保证普通对象创建完成之后,再生成其AOP代理(尽可能延迟代理对象的生成)

所以Spring用了第三级缓存,既维持了设计原则,又处理了循环依赖;牺牲那么一丢丢内存空间是愿意接受的

THE END
1.课题研究视角有哪些2、研究方法:研究方法一般包括文献调查法、观察法、思辨法、行为研究法、历史研究法、概御蠢念分析法、比较研究法等。 问:毕业论文题目为成本控制存在的问题及对策分析,有1小节是论述关于课题的研究视角,研究视角是什么啊? 答:这个陵纯研究视角,就是研究角度,跟你的论题有关。比如尺兄咐你的论题是XX公司,那研究https://www.igaichong.com/article/28746f47358f3297216fca57.html
2.论文中的研究意义是什么意思论文中的研究意义是什么意思 研究意义,指的是一项研究它所具备的意义,在论文中阐述研究意义时,我们可以先从现实问题分析方面入手,指出生活中出现的问题,以及需要解决、研究它的必要性,然后再阐述理论或实践意义,来表明自己的逻辑。 在实际撰写研究意义时,可以参考以下角度:https://www.duyan.com/news/paper/115.html
3.从源码角度,带你研究什么是三级缓存首先我们得知道 三级缓存里面分别存的什么 一级缓存里存的是成品对象,实例化和初始化都完成了,我们的应用中使用的对象就是一级缓存中的 二级缓存中存的是半成品,用来解决对象创建过程中的循环依赖问题 三级缓存中存的是 ObjectFactory<?> 类型的 lambda 表达式,用于处理存在 AOP 时的循环依赖问题 https://blog.csdn.net/liyunlong819/article/details/121710555
4.管理宽度是什么?二、管理宽度的不同研究角度 1、从圣经故事角度 《圣经》中记载着摩西一则故事,约公元前1300年,摩西曾被俘虏到埃及,后来他汲取埃及的管理经验,成为希伯来人的领导者。 在摩西带领希伯来人为摆脱埃及人的奴役而出走的路上,一开始,每个人也都可以直接向摩西汇报,大事小情摩西都要亲自处理,不久,摩西精疲力尽。 https://www.ruthout.com/information/23822.html
5.管理宽度是什么?二、管理宽度的不同研究角度 1、从圣经故事角度 《圣经》中记载着摩西一则故事,约公元前1300年,摩西曾被俘虏到埃及,后来他汲取埃及的管理经验,成为希伯来人的领导者。 在摩西带领希伯来人为摆脱埃及人的奴役而出走的路上,一开始,每个人也都可以直接向摩西汇报,大事小情摩西都要亲自处理,不久,摩西精疲力尽。 https://www.aqzpw.com/article/index.php?c=show&id=23728
6.研究视角独特(精选十篇)需要说明的是, 以下学者在对研究对象进行阐述的过程中, 研究视角多相互重叠, 因此, 笔者在下文的分类论述中, 仅选取学者在其文章中较为侧重的部分作为分类的依据。 (一) 民族工艺本体研究中的性别呈显 在我国民族民间手工艺社会性别研究中, 若从本体角度出发展开研究, 研究者主要是从手工艺的本体中探寻两性审美https://www.360wenmi.com/f/cnkeyc2ee87l.html
7.从成分研究的角度看,防脱发是不是“伪命题”?总结来看,目前防脱发的主要研究集中在医药领域,通过相关的非处方药治疗脱发是主流的解决方案,而洗护产品能提供的更多是保护、预防的辅助作用。 从成分角度而言,防脱发产品的大多数成分确实经过了多年的研究,但截止目前,诸如咖啡因、植物提取物之类的成分,在人体实际应用上的效果却难以令人满意。可见,防脱发产品还需要走https://36kr.com/p/1446435380357251
8.Contents/premium.mdatmaster·Newslab2020/Contents·GitHub用新的框架研究2019年香港的手机直播。 645 芭芭拉·沃尔特斯: 打破玻璃天花板的女主播 2023/1/19 从歧视女性的职场中脱颖而出; 采访名人,并因此而成名; 她的时代在远去。 644 预测2023 2023/1/16 AI为新闻业带来的混乱与机会; 如果Twitter将死,谁来替代? https://github.com/Newslab2020/Contents/blob/master/premium.md
9.当日本人在说“可爱”的时候究竟想表达什么?163想到可爱,我们会经常想到的事物、熊猫、猫狗、或者是小孩子,或者是你喜欢的人等等,虽然日本人也经常会这样用,但他们对“可爱”一词的使用可说是到了一个极致。那么这个风靡全球的日本“可愛い”文化,到底是什么呢? 打开网易新闻 查看精彩图片 从科学角度研究“可爱” https://dy.163.com/v2/article/detail/ES1CFA6O051484CH.html
10.语言研究的多维视角再有值得我们重视的是认知语法,或称为认知语言学。什么是认知语言学?它的主要研究范围和研究方法是什么?它的优点和缺点都是什么? 另外,就是符号学。从符号学角度可以探讨什么类型的问题?见我的论文《论语言与符号-语言学与符号学思辨》,中国俄语教学,2007,1期。 http://www.hncfs.edu.cn/info/1022/101061.htm
11.练宏注意力分配——基于跨学科视角的理论述评佩罗还提出了工作时间社会学的概念,该概念强调社会科学研究要关注组织环境,研究角度应该从个体层面提升到组织或集体层面。因为个体时间使用并不是一个独立过程,它与组织环境之间相互依赖(Perlow,1999)。 3 微观:从组织时间到个体时间 社会学领域还有一些研究更多侧重微观层面的个体时间分析。但这些研究不同于管理学的个http://www.360doc.com/content/24/0822/19/16295112_1132043727.shtml
12.绪论究竟是什么,答案全在这里面了!一、研究角度的创新。相较……本文以民营汽车零部件企业为例进行探究,视角新颖,且具有较强的实践性。 二、研究对象极具代表性。本文主要以……为研究案例进行并购绩效的分析,研究对象……极具代表性,通过研究……提供参考依据。 三、方法创新。……的研究中,多数学者运用方法较为单一,一般以一种或两种为主,而本https://www.jianshu.com/p/229a436187a5
13.翻译文摘:国外翻译规范研究的述评翻译资讯(Toury, 1999) 然而,对翻译规范的研究此前早已开始, 只不过人们当时并未使用“规范”一词, 而使用的是“规则”(rule) 。综观20 世纪50 年代以来的国外翻译规范研究, 大致可分为3 个方面: (1) 从传统语言学角度探讨翻译规范; (2) 从篇章语言学角度研究规范;(3) 从翻译研究角度探讨规范。https://www.oktranslation.com/news/twininfo26692.html
14.总体范围作出具体的规定,主要在于明确研究的角度,指的刷刷题APP(shuashuati.com)是专业的大学生刷题搜题拍题答疑工具,刷刷题提供对研究问题所涉及的研究对象的总体范围作出具体的规定,主要在于明确研究的角度,指的是研究范围的()A.表述B.界定C.操作D.协助的答案解析,刷刷题为用户提供专业的考试题库练习。一分钟将考试题Whttps://www.shuashuati.com/ti/42d1525e79654e1c933c968cb6b9a050.html