Spring三级缓存流程再梳理

news2024/11/15 11:19:56

本文主要是说下在使用spring时遇到了循环依赖,Spring利用三级缓存怎么解决

getBean(beanName)

doGetBean(name, null, null, false);
	getSingleton(beanName)方法, 最后会通过addSingleton(beanName, singletonObject)存到一级缓存里面去

createBean(beanName, mbd, args);

doCreateBean(beanName, mbdToUse, args);
	1、实例化普通对象,生成singletonFactory对象存到三级缓存里面去,任何对象都会存到三级缓存,因为后面存一级缓存的时候,都会把三级缓存里面删掉
	2、填充属性,包括循环依赖
	3、初始化处理,AOP代理对象,如果符合AOP逻辑,那么
	4getSingleton(false)从缓存中获取对象,为什么上面创建对象了,这里还要再次获取对象,主要是循环依赖的时候这里可能已经生成好了。

备注:singletonFactory.getObject和Bean的初始化都会经过AOP来判断一次是否需要创建代理对象,但是二者只会有一个创建代理对象,他们里面利用了一个中间earlyProxyReferences缓存,创建过就不会再创建了,这个缓存不是三级缓存别搞混了

案例1:A和B只是普通类之间的相互引用

1、A先创建普通实例,然后生成一个singletonFactory对象存到三级缓存,没有什么条件基本上都会被塞到三级缓存里面。
2、A属性填充,发现需要B

3、调用B的CreateBean,B创建普通实例,singletonFactory对象存到三级缓存,没有什么条件,都会存到三级缓存里面去。
4、B属性填充,B里面需要A,然后通过三级缓存里面找,发现有,通过getObject得到A的实例对象引用,在存到二级缓存里面去,注意这里是A的实例对象,和前面A创建的实例对象是同一个,为什么,因为getObject虽然会触发后置处理的调用,但是因为不走AOP所以,调用完后置处理器,返回的依旧是A的普通实例,而这个A的普通实例哪里来的,就是在生成singletonFactory对象时候,把一开始生成的普通对象穿进去的。
5、因为是普通实例,所以B执行后置处理器,不走AOP,返回的依旧是普通的实例
6、再把B从三级缓存中移除,存到一级缓存里面去。

7、再回到A,此时A调用getBean就可以返回B的实例对象,这个时候,B已经在1级缓存,A还在二级缓存里面。

8、A的属性填充完之后,调用初始化方法,走后置处理器,因为不是AOP所以初始化之后得到的A还是普通实例

9、在接着走getSingleton(false)方法,这个时候A已经被丢到了二级缓存,所以getSingleton也会拿到对象,但是这里拿到的对象和A一开始实例化的对象是一样的。

10、最后再把A塞到1级缓存,从二级缓存中移除。

案例2:A和B都会创建代理对象,2者相互引用。

首先需要知道,A和B都是先创建普通实例对象,然后在把A和B这个普通实例对象的属性填充好,在通过这个普通实例对象来生成代理对象,因为代理对象最终也是会拿到这个普通实例对象,调用目标具体方法。
并且,A和B的普通实例对象,里面的属性赋值,赋的是代理对象,不是普通实例对象。

1、先普通实例化A,然后生成一个singletonFactory对象存到三级缓存
2、属性填充,发现需要注入B

3、调用B的CreateBean,B创建普通实例,singletonFactory对象存到三级缓存

4、B属性填充,B里面需要引入A,调用getSingleton(A, true);因为A已经在三级缓存里面了,所以会触发A的singletonFactory.getObject方法

5、A这个时候就会通过SmartInstantiationAwareBeanPostProcessor后置处理器来创建A的代理对象,并且会把A从三级缓存中移除,A添加到二级缓存里面去。

6、B调用初始化方法,这个时候B会通过后置处理器来创建代理对象,具体哪个后置和选用注解有差异,比如@Aspect和@Async创建代理的后置处理器就不一样。此时B的实例已经变成了代理对象。

7、B在调用getSingleton(beanName, false);方法,返回Null因为穿了false,注意此时B还是三级缓存里面,A已经不在三级缓存里面了,A已经跑了二级缓存里面去了,并且A此时已经是一个代理对象了

8、最后返回B实例化好的代理对象,存到一级缓存里面,然后清空三级缓存。

9、回到A的属性填充逻辑,因为此时B已经实例化了,然后把A的属性赋好值。

10、开始触发A的初始化方法,通过后置处理器创建A的代理对象,当发现A已经在缓存earlyProxyReferences里面,说明已经创建过A的代理对象,所以就不在创建A的代理对象,此时初始化方法返回的还是A的普通实例对象。

11、A开始调用getSingleton(A, false);因为此时二级缓存已经保存了A的代理对象,将代理对象取出替换A的普通实例对象,返回A的代理对象。

12、最后将A的代理对象存到一级缓存里面去,在移除二级缓存里面的数据。

待确认:B这个类里面的属性,填充进去的是A的普通对象还是代理对象。 代理对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1083938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何进行pyhon的虚拟环境创建及管理

无论服务器或者本地,创建虚拟环境都是: 【Python】搭建虚拟环境_python创建虚拟环境_今天自洽了吗的博客-CSDN博客 虚拟环境绑定到项目 这个是运行环境,可以切换任意运行环境 如果是服务器上:可以先source xx/bin/active&#xf…

颠覆性语音识别:单词级时间戳和说话人分离 | 开源日报 No.53

vbenjs/vue-vben-admin Stars: 19.7k License: MIT Vue Vben Admin 是一个免费开源的中后台模板,使用最新的 vue3、vite4 和 TypeScript 等主流技术进行开发。该项目提供了现成的中后台前端解决方案,并可用于学习参考。 使用先进的前端技术如 Vue3/vit…

[电源选项]没有系统散热方式,没有被动散热选项

背景 笔记本的风扇声音太大,想改成被动散热方式,又不想影响性能。 于是我打开了控制面板\所有控制面板项\电源选项,点更改计划设置-> 更改高级电源设置。 想把散热方式改成被动散热。发现win11中好像没有这个选项了! 如何…

JVM(一)

字节码文件的组成: 基础信息:魔数,字节码文件对应的java版本号,访问表示public final以及父类和接口 常量池:保存了字符串常量,类或者是接口名,字段名,主要在接口中使用 字段:当前类或者是接口声明的字段信息 方法:当…

win10 wsl安装步骤

参考&#xff1a; 安装 WSL | Microsoft Learn 一、安装wsl 1.若要查看可通过在线商店下载的可用 Linux 发行版列表&#xff0c;请输入&#xff1a; wsl --list --online 或 wsl -l -o> wsl -l -o 以下是可安装的有效分发的列表。 使用 wsl.exe --install <Distro>…

知识体系图谱

知识体系图谱 最近更新简历的时候&#xff0c;有种好像去年到今年学了很多&#xff0c;但是都零零散散的&#xff0c;不成体系&#xff0c;就想着抽时间总结归纳一下知识体系&#xff0c;目前我个人的技术栈是这样的&#xff1a; 还是稍微有点乱&#xff0c;下一次更新的时候再…

HQChart支持的画图工具列表

HQChart支持的画图工具列表 线段类线段射线标价线垂直线箭头趋势线水平线水平线段平行射线平行线平行通道价格通道线M头W底头肩型波浪尺AB波浪尺箱型线涂鸦线段 图形类圆弧线矩形平行四边形三角形圆对称角度 文字类文本箭头NoteAnchoredTextPriceLabelPriceNote 其他江恩角度线…

Ubuntu下怎么配置vsftpd

2023年10月12日&#xff0c;周四中午 目录 首先要添加一个系统用户然后设置这个系统用户的密码给新创建的系统用户创建主目录启动vsftpd服务查看vsftpd服务的状态打开外界访问vsftpd服务所需的端口获取服务器的IP地址大功告成 首先要添加一个系统用户 useradd 用户名然后设置…

如何应对量化交易,个人股票账户如何实现量化程序化自动交易

目前股票量化交易是对个人账户开放的&#xff0c;如果你没开通&#xff0c;可能是没有找对渠道&#xff0c;很多券商的手机客户端是包含某些简易版的策略交易&#xff0c;如网格策略&#xff0c;自动止盈止损等&#xff0c;这些策略交易虽然简单、灵活性差&#xff0c;但也是量…

【数据安全】数据安全运维是什么意思?有什么意义?

随着数字化大力发展&#xff0c;保障企业重要资产数据的安全越发重要&#xff0c;因此衍生了数据安全运维工作。那你知道数据安全运维是什么意思&#xff1f;有什么意义&#xff1f; 数据安全运维是什么意思&#xff1f; 数据安全运维是将数据分析技术用于管理数据的过程&…

【萌新向】Sql Server保姆级安装教程-图文详解手把手教你安sql

首先打开百度&#xff0c;搜索sql server&#xff0c;找到图示词条&#xff0c;点击进去。 一般版本是需要付费的&#xff0c;正常开发可以使用免费版本【Express】&#xff0c;点击下载 下载完成后打开下载的文件。三个选项&#xff0c;我们选自定义方式。 选择语言和位置…

第四范式破发,AI大模型之殇?

9月28日&#xff0c;决策类AI独角兽第四范式敲钟挂牌港交所&#xff0c;发行价为55.60港元/股&#xff0c;IPO首日报收58.50港元/股&#xff0c;涨幅5.22%。不过也就日内富贵&#xff0c;在之后的几个交易日里&#xff0c;市值蒸发超20亿港元&#xff0c;截止目前&#xff0c;股…

Air001 TIM1高级定时器单脉冲输出模式使用

Air001 TIM1高级定时器单脉冲输出模式使用 ✨本例程基于合宙官方提供的标准库以及Demo工程作为验证参考。&#x1f4cd;官方提供的SDK包资源&#xff1a;https://gitee.com/openLuat/luatos-soc-air001&#x1f33f;想了解STM32高级定时器单脉冲输出模式了解可以参考阅读:https…

C++ 黑马程序员通讯录管理系统源码

/* 通讯录管理系统 通讯录是一个可以记录亲人、好友信息的工具。 本教程主要利用C来实现一个通讯录管理系统系统中需要实现的功能如下: 添加联系人:向通讯录中添加新人&#xff0c;信息包括 (姓名、性别、年龄、联系电话、家庭住址))最多记录1000人 显示联系人:显示通讯录中所有…

前端开发工具vscode

一、下载安装 https://code.visualstudio.com/ 二、安装插件 三、使用 ①、创建一个空目录 ②、利用vscode工具打开该目录 ③、将该目录设置为工作区 在工作区中添加文件&#xff0c;还可以进行浏览器访问&#xff08;提前安装了Live Server插件&#xff09;

linux下安装ffmpeg的详细教程、ffmpeg is not installed

1、下载解压 wget http://www.ffmpeg.org/releases/ffmpeg-6.0.tar.gz tar -zxvf ffmpeg-6.0.tar.gz 2、 进入解压后目录,输入如下命令/usr/local/ffmpeg为自己指定的安装目录 cd ffmpeg-6.0 ./configure --prefix/usr/local/ffmpeg make sudo make install 3、配置变量 v…

在Windows下自己从源码编译Python3.10.13成安装包

文章目录 &#xff08;一&#xff09;Python 3.10 的生命周期&#xff08;一&#xff09;下载源码&#xff08;二&#xff09;准备环境&#xff08;三&#xff09;编译&#xff08;3.1&#xff09;解压源码到目录&#xff08;3.2&#xff09;下载依赖&#xff08;PCBuild&#…

推荐一款AI写作大师、问答、绘画工具-「智元兔 AI」

在当今技术飞速发展的时代&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;的应用已经深入到各个领域。其中&#xff0c;AI写作大师、问答、绘画工具是备受关注和追捧的热门应用之一。在众多的选择中&#xff0c;有一款笔者在使用过程中…

分享一下做一个电商小程序可以实现什么功能

电商小程序是一种基于微信小程序平台的电子商务应用&#xff0c;它可以帮助商家展示商品信息、提供在线支付、订单管理等功能&#xff0c;从而吸引更多的用户进行消费。本文将介绍电商小程序可以实现的一些主要功能&#xff0c;以帮助读者了解其优势和应用场景。 商品展示与搜索…

AWS SAP-C02教程3--网络资源

架构设计中网络也是少不了的一个环节,而AWS有自身的网络结构和网络产品。本章中将带你看看AWS中不同网络产品,以及计算资源、存储资源等产品在网络架构中处于哪个位置,如何才能让它们与互联网互通、与其它产品互通。下图视图将SAP涉及到网络相关组件在一张图表示出来,图中可…