spring三级缓存之相互依赖

news2024/9/25 7:18:57

spring三级缓存之相互依赖

  • 什么是sping的互相依赖
  • sping的三级缓存
      • 三级缓存存储了什么内容?
      • 三级缓存的存在是为了解决什么问题?
      • 三级缓存的怎样解决互相依赖的问题?
        • 缓存解决A和B相互依赖的过程
        • 三级缓存解决AOP并且A和B互相依赖的过程
      • 三级缓存所有相互依赖的问题都能解决吗?

什么是sping的互相依赖

一个或多个对象之间存在直接或间接的依赖关系,这种依赖关系构成一个环形调用。
在这里插入图片描述
A和B相互调用 对标java代码样例
目前这种情况sping已经解决互相依赖的问题,后面解释原因

@Service
public class A {

    @Autowired
    private B b

    public void testA() {
    }
}

@Service
public class B {

    @Autowired
    private A a;
    
    public void testB() {
    }
}
相互依赖的问题原因:
在对象A创建过程中,需要注入对象B,容器中没有对象B就去创建对象B
对象B创建过程中又需要注入对象A,而对象A在等待对象B的创建,对象B在等待对象A的创建
导致两者都无法创建成功,无法加入到单例池供用户使用

sping的三级缓存

三级缓存存储了什么内容?

    
    总体来说,就是bean在创建过程中存在的三种对象形态集合。
    
    一级存储集合: 完整的bean, 实例化完成,属性已赋值初始化完成
    private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);
    
    二级存储集合: 不完成的bean, 实例化完成,属性未赋值初始化未完成
    private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap(16);

    三级存储集合: 存放了一个bean的lambda表达式,实例化完成但未赋值未初始化完成
    private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);
    

三级缓存的存在是为了解决什么问题?

    互相依赖的问题

三级缓存的怎样解决互相依赖的问题?

缓存解决A和B相互依赖的过程
优先说明 (对象A == origin对象A)
1. 创建对象A的实例的时候,会先通过java反射创建original对象A(相当于new),但是还没有设置任何属性,此时将original对象A存入缓存中备用
2. 继续给对象A设置属性和依赖,发现对象A依赖对象B, 查找缓存后并未找到就去创建对象B
3. 创建对象B的过程中发现对象B依赖对象A,就从缓存中拿到original对象A进行使用,创建对象B成功后将对象B赋值给对象A,这样对象A/B都创建成功了

从上边的过程中不难发现,二级存储就解决了对象依赖的问题,那问题来了?为什么要存在三级存储呢?因为还要考虑一种特别情况--------AOP(至于AOP,后边出了相关的文档再进行关联说明),由于AOP在创建Bean后如果有需要代理的方法,那么系统就会自动配置对应的后置处理器,这样生成的对象bean就不等于二级缓存中生成的orginal对象bean了。为了解决这个问题才出现了三级缓存。

三级缓存解决AOP并且A和B互相依赖的过程
1. 创建对象A的实例的时候,会先通过java反射创建original对象A(相当于new)
2. 先去判断一级缓存中是否存在,如果不存在就向三级缓存中添加一条记录对象A-bean,key是bean的beanName,value是ObjectFactory,可以通过执行Lambda表达式可以生成对象A的代理对象
3. 再去判断二级缓存中是否存在,如果存在删除三级缓存中的数据,继续给二级缓存中的对象A-bean进行设置属性,否则使用三级缓存中的bean,设置过程中发现需要依赖对象B
4. 创建original对象B,然后去一级缓存中查询是否存在,不存在的话就在三级缓存中增加一条数据,如果二级缓存中存在就用二级缓存数据否则就用三级缓存
5. 创建originalB后设置属性时候发现对象B依赖对象A,去一级二级缓存中查询是否存在对象A,存在就使用,不存在去三级缓存中拿到对象A的bean(至于需不需要获取代理对象根据需要拿)
6. 将拿到的对象A-bean保存在对象B-bean中,这样对象依赖的对象B就创建好了,删除三级缓存数据存入二级缓存
7. 然后继续创建对象A的bean
8. 反过来创建对象B,最后对象A和对象B都生成了

三级缓存所有相互依赖的问题都能解决吗?

并不是哦,多例、构造器注入的bean不可以,因为循环依赖的原理的实例化后提前暴露的引用,这两种情况还没实例化

依赖情况依赖注入方式是否支持
AB循环依赖AB均采用构造器注入
AB循环依赖AB均采用setter方法注入
AB循环依赖AB均采用属性自动注入
AB循环依赖A中注入为setter注入,B中注入的A为构造器注入
AB循环依赖B中注入的A为setter注入,A中注入的B为构造器注入

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

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

相关文章

Python 操作mysql实现事务处理

一、应用场景 Python项目对MySQL数据库进行增、删、改操作时&#xff0c;有时会出现执行sql异常的情况。在批量提交数据的时候&#xff0c;如果其中一个事务提交错误&#xff0c;往往导致预期的整个数据链不完整。 例如银行转账数据&#xff0c;用户A向用户B转账&#xff1a; …

blast安装及简单使用

一、安装blast 1.Ubuntu环境 # 下载blast wget https://ftp.ncbi.nlm.nih.gov/blast/executables/blast/2.9.0/ncbi-blast-2.9.0-x64-linux.tar.gz # 解压blast压缩包 tar -xzvf ncbi-blast-2.9.0-x64-linux.tar.gz # 测试 ./bin/blastp -h 这里就代表安装成功了&#xff0c;…

Mac电脑上设置一位数密码

1. 打开“终端”应用程序&#xff0c;你可以在 “ 应用程序 ” 文件夹中找到它。 2. 在终端窗口中&#xff0c;输入以下命令并按下回车键 pwpolicy -clearaccountpolicies 这个命令的目的是清除全局账户策略&#xff0c;允许设置较低位数的密码。 3. 输入你的开机密码并按下…

springCould-从小白开始【1】

目录 1.说明 2.父工程 3.服务端 4.消费者 5.公共模块 6.RestTemplate 1.说明❤️❤️❤️ 创建三个模块&#xff0c;服务者&#xff0c;消费者&#xff0c;公共api 注&#xff1a;spring boot和spring cloud有版本约束 2.父工程 ❤️❤️❤️ 约定版本号配置 注意&…

GSCoolink GSV1201E Type C/DP1.2转HDM1.4

DisplayPort 1.2 to HDMI 1.4 Converter with Embedded MCU 功能特征 1、GSV1201E是一款高性能、低功耗、USB Type-C Alternate Mode DisplayPort 1.2 to HDMI 1.4转换器。 2、显示接口接收器支持21.6Gbps(HBR2&#xff0c;4-lane)。 3、HDMI发射器支持9Gbps(TMDS3G3Lane)。…

OpenHarmony南向之TP触摸屏

概述 Touchscreen驱动用于驱动触摸屏使其正常工作&#xff0c;该驱动主要完成如下工作&#xff1a;对触摸屏驱动IC进行上电、配置硬件管脚并初始化其状态、注册中断、配置通信接口&#xff08;I2C或SPI&#xff09;、设定Input相关配置、下载及更新固件等操作。 Touchscreen驱…

mysql:查看线程缓存中的线程数量

使用命令show global status like Threads_cached;可以查看线程缓存中的线程数量。 例如&#xff0c;查询线程缓存中的线程数量如下&#xff1a; 然后启动应用程序&#xff0c;使用连接&#xff0c;查询如下&#xff1a; 由查询结果可以看到&#xff0c;线程缓存中的线程数量…

人工智能时代,看好硅光子!

硅光子学是一种用于制备光子集成电路&#xff08;PIC&#xff09;的技术&#xff0c;通常用于产生、检测、传输和处理光。这种方法使用半导体绝缘体上硅&#xff08;SOI&#xff09;晶片作为衬底材料&#xff0c;并采用标准的互补金属氧化物半导体&#xff08;CMOS&#xff09;…

弧形导轨的类型及应用

弧形导轨又叫圆弧形导轨&#xff0c;滚轮弧形导轨&#xff0c;是通过V型滚轮在圆弧形V型导轨面上的滚动&#xff0c;实现圆周运动&#xff1b;在工业自动化中&#xff0c;有些应用需要弧线运动&#xff0c;或者两个相交或平行的直线运动&#xff0c;这些情况需要通过弧线运动连…

netsdk1004 找不到资产文件“d:\vs-code\consoleapp1\consoleapp1\obj\project.assets.json”

今天学C#遇到一个问题记录下 创建如上所示的项目后运行出错&#xff1a; netsdk1004 找不到资产文件“d:\vs-code\consoleapp1\consoleapp1\obj\project.assets.json”。运行 nuget 包还原以生成此文件。 consoleapp1 c:\program files\dotnet\sdk\8.0.100\sdks\microsoft.net…

pyCharm 创建一个FastApi web项目,实现接口调用

FastApi和Django区别 我这边演示项目使用的fastApi作为web框架&#xff0c;当然主流一般都是使用Django做web框架&#xff0c;但是Django是一个重量级web框架他有很多组件&#xff0c;如授权&#xff0c;分流等全套web功能。我这边呢只需要有个接口可以被别人调用&#xff0c;…

脉冲水表和光电直读水表有什么区别?

脉冲水表和光电直读水表是两种常见的水表类型&#xff0c;它们在原理和功能上有着一些明显的区别。在本文中&#xff0c;我们将探讨脉冲水表和光电直读水表的区别&#xff0c;并讨论它们各自的优势和适用场景。 首先&#xff0c;我们来看看脉冲水表。脉冲水表是一种机械式水表&…

Python列表操作详解,多种方式删除首元素

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;处理列表的操作是日常开发中不可避免的任务之一。其中&#xff0c;删除列表中的元素是一个常见的需求&#xff0c;而删除第一个元素更是一个特殊的场景。本篇博客将详细介绍Python中多种方…

C++ Qt开发:TabWidget实现多窗体功能

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍TabWidget标签组件的常用方法及灵活运用。 Q…

3D可视化大屏:赋能行业数据可视化应用,让数据更鲜活

互联网时代&#xff0c;各种数据信息充斥在我们的生活中&#xff0c;对于大量的数据&#xff0c;我们也需要大量的时间才能去分析理解&#xff0c;因此3D可视化大屏的展示无疑是令人兴奋的进步。3D数据大屏能够将数据以更加直观、更加生动的方式呈现出来&#xff0c;结合VR全景…

vue 如何实现拖动:vue-draggable

vue-draggable 官方文档&#xff1a;传送门 特点&#xff1a; 支持触摸设备&#xff08;如vue项目的移动端开发Quasar&#xff09;支持拖拽和选择文本支持不同列表之间的拖拽视图模型的同步刷新与vue2的过渡动画&#xff08;transition-group&#xff09;兼容有很多监听函数…

【算法刷题】Day21

1. 【模板】前缀和 原题链接 题干&#xff1a; 给定一个长度为 n 的数组 有 q 次查询&#xff0c;每次有两个参数 l 和 r 算法原理&#xff1a; 1. 暴力解法 &#xff08;模拟&#xff09; 这个时间复杂度是 O(n) 2. 前缀和&#xff08;快速求出数组中某一个连续区间的和&…

猫粮什么品牌好?业内人生分享五个口碑好质量好主食冻干猫粮牌子

随着养猫的人越来越多&#xff0c;铲屎官们对猫咪的饮食也越来越注重。除了猫粮&#xff0c;很多铲屎官还会给猫咪准备小零食。那么&#xff0c;猫咪是不是除了猫粮就没有其他可吃的了呢&#xff1f;答案当然不是。猫咪还有猫冻干、冻干猫粮、猫条等可以选择。每个铲屎官都希望…

ShellExecute打开网页

效果图&#xff1a; 相关代码: void Open_url::on_pushButton_clicked() {QString path1 "explorer.exe";QString urlui->lineEdit->text();ShellExecute(NULL, L"open", path1.toStdWString().c_str(), url.toStdWString().c_str(), NULL, SW_SHO…

【QT】Model/View结构

目录 1 概述 2 Mode/View基本原理 3 数据模型 4 视图组件 5 代理 6 Model/View结构的一些概念 6.1 Model/View的基本结构 6.2 模型索引 6.3 行号和列号 6.4 父项 6.5 项的角色 1 概述 Model/View&#xff08;模型/视图&#xff09;结构是Qt中用界面组件显示与编辑数据的一种结构…