当前位置: 首页 > news >正文

Spring为什么要用三级缓存解决循环依赖?

Spring为什么要用三级缓存解决循环依赖?

    • 1. Spring是如何创建一个bean对象
    • 2. Spring三级缓存
      • 2.1 一级缓存:单例池,经历过完整bean生命,单例Bean对象
      • 2.2 二级缓存:提前暴露的Bean
      • 2.3 三级缓存:打破循环
    • 3. Spring 解决不了的循环依赖
    • 4.总结

1. Spring是如何创建一个bean对象

  1. 推断构造方法
    默认采用无参构造,如果不存在无参构造,判断有参构造受否唯一,如果唯一选择有参构造,不唯一报错。

  2. 普通对象

  3. 依赖注入

  4. 初始化前(@PostConstruct)
    在类中方法上添加@PostConstruct注解,该方法会在初始化前执行。

  5. 初始化(InitializingBean)
    类实现InitializingBean接口,重写afterPropertiesSet方法。

  6. 初始化后(AOP)

  7. 代理对象

  8. 放入Map单例池

  9. Bean对象

2. Spring三级缓存

在这里插入图片描述

通过分析源码:
doCreateBean方法

2.1 一级缓存:单例池,经历过完整bean生命,单例Bean对象

private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

2.2 二级缓存:提前暴露的Bean

private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);

2.3 三级缓存:打破循环

private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

//<beanName, 单例创建的工厂>

在创建bean 的源码中先判断是否是单例,支持循环依赖,当前正在创建的单例, 满足上面条件就会创建一个lambda表达式放入三级缓存中。
getEarlyBeanReference方法中会判断是否存在AOP,存在就创建代理对象,不存在就返回通过构造方法创建的普通对象。

在这里插入图片描述
在三级缓存lambda方法中判断是否创建代理对象
在这里插入图片描述

上边源码中看到只要走三级缓存的会调用getEarlyBeanReference方法,该方法会把执行过AOP的Bean存放在earlyProxyReferences的Map集合中,用于后续bean生命周期的初始化后是否AOP创建代理对象校验。

在这里插入图片描述

初始化后,校验是否AOP创建代理对象,通过校验earlyProxyReferences集合中bean是否与传入bean相同来判断。

在这里插入图片描述

获取单例bean
在这里插入图片描述

3. Spring 解决不了的循环依赖

1.构造器循环依赖(实例化阶段循环依赖) 解决办法添加@Lazy注解
底层原理是创建代理对象,
在这里插入图片描述

4.总结

在Java Spring的厨房里,循环依赖这道菜可是让不少程序员大厨头疼的“黑暗料理”。但Spring大厨微微一笑,不慌不忙地亮出了他的秘密武器——三级缓存“时光机”!
一级缓存,那是“秒出”区,新鲜出炉的Bean直接上桌,快得就像外卖小哥的闪电送。
二级缓存,咱们叫它“半成品天堂”,Bean们在这里稍作休息,等待最后的调味。但别急,好戏还在后头!
重头戏来了,三级缓存——“未来豆预测局”!这里,Spring大厨仿佛拥有了预知未来的超能力,提前把即将诞生的Bean们“画”在纸上,等它们真正诞生时,直接对号入座,无缝衔接。这操作,简直比科幻电影还炫酷!
就这样,Spring大厨用三级缓存的“时光机”,轻松玩转循环依赖这道难题,让厨房里的Bean们手拉手也能和谐共处,共同烹饪出美味的应用大餐。程序员们纷纷点赞:“Spring大厨,你是我们的超级英雄!”

在这里插入图片描述

相关文章:

Spring为什么要用三级缓存解决循环依赖?

Spring为什么要用三级缓存解决循环依赖&#xff1f; 1. Spring是如何创建一个bean对象2. Spring三级缓存2.1 一级缓存&#xff1a;单例池&#xff0c;经历过完整bean生命&#xff0c;单例Bean对象2.2 二级缓存&#xff1a;提前暴露的Bean2.3 三级缓存&#xff1a;打破循环 3. S…...

【Redis入门到精通三】Redis核心数据类型(List,Set)详解

目录 Redis数据类型 ​编辑 1.List类型 &#xff08;1&#xff09;常见命令 &#xff08;2&#xff09;内部编码 2.Set类型 &#xff08;1&#xff09;常见命令 &#xff08;2&#xff09;内部编码 Redis数据类型 查阅Redis官方文档可知&#xff0c;Redis提供给用户的核…...

本科生如何学习机器学习

一、入门阶段 1. 数学与统计学基础 高等数学&#xff1a;学习微积分、极限、级数等基本概念。线性代数&#xff1a;掌握矩阵运算、特征值和特征向量、线性方程组等。概率论与统计学&#xff1a;理解概率分布、假设检验、贝叶斯定理等统计知识。 2. 编程语言学习 Python&…...

海康威视摄像机和录像机的监控与回放

文章目录 海康威视摄像机和录像机的监控与回放1、海康威视监控设备简介1.1、摄像机二次开发1.1.1&#xff1a;协议选择 1.2&#xff1a;web集成1.2&#xff1a;标准协议对接1.2.1&#xff1a;ffmpeg软件转流1.2.2&#xff1a;开源监控软件shinobi1.2.2.1 安装使用1.2.2.2 shino…...

校医务室健康服务系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;医生管理&#xff0c;医患交流管理&#xff0c;预约医生管理&#xff0c;健康打卡管理&#xff0c;运动打卡管理&#xff0c;饮食打卡管理 微信端账号功能包括&#xff1a;系统首…...

MySQL 中的 UTF-8 与 UTF8MB4:差异解析

在 MySQL 数据库中&#xff0c;字符集的选择对于数据的存储和处理至关重要。其中&#xff0c;UTF-8 和 UTF8MB4 是两个常见的字符集选项。那么&#xff0c;它们之间到底有什么区别呢&#xff1f; 一、字符集简介 UTF-8 UTF-8&#xff08;8-bit Unicode Transformation Format&…...

nvm无法下载npm的问题

1、问题 执行 nvm install 14.21.3 命令&#xff0c;node可以正常下载成功&#xff0c;npm下载失败 2、nvm配置信息 …/nvm/settings.txt root: D:\soft\nvm path: D:\soft\nodejs node_mirror: npmmirror.com/mirrors/node/ npm_mirror: registry.npmmirror.com/mirrors/…...

数据结构与算法——Java实现 6.递归

要学会试着安静下来 —— 24.9.17 一、递归的定义 计算机科学中&#xff0c;递归是一种解决计算问题的方法&#xff0c;其中解决方案取决于同一类问题的更小子集 说明: ① 自己调用自己&#xff0c;如果说每个函数对应着一种解决方案&#xff0c;自己调用自己意味着解决方案是…...

.Net Core 生成管理员权限的应用程序

创建一个ASP.NET Core Web API项目 给解决方案设置一个名称 选择一个目标框架&#xff0c;这里选择的是 .NET 8.0框架 在Porperties文件夹中添加一个app.manifest文件 设置app.manifest文件属性&#xff0c;生成操作设置为嵌入的资源 双击解决方案名称&#xff0c;编辑WebAppli…...

DAY15:链表实现学生信息管理系统

要求功能&#xff1a; 创建学生信息表 头插法输入学生信息 尾插法输入学生信息输出任意位置范围内的学生信息 头删法删除学生信息尾删法删除学生信息按位置添加学生信息按位置删除学生信息 按位置修改学生信息按位置查找学生信息释放空间 今天有点累&#xff0c;懒得写注释了&a…...

JAVA语法基础 day05-面向对象

一、面向对象基本概念 /* 面向对象编程的步骤&#xff1a; 1.先设计对象的模板&#xff0c;也就是一个类class 生成一个新类的语句是&#xff1a;public class 类名,就跟python中class 类名一样 2.通过new关键字生成具体的对象&#xff0c;每new一次代表创建了的一个新的对象*…...

关于RabbitMQ重复消费的解决方案

一、产生原因 RabbitMQ在多种情况下可能会出现消息的重复消费。这些情况主要包括以下几个方面&#xff1a; 1. 网络问题 网络波动或中断&#xff1a;在消息处理过程中&#xff0c;由于网络波动或中断&#xff0c;消费者向RabbitMQ返回的确认消息&#xff08;ack&#xff09;…...

【SSM-Day2】第一个SpringBoot项目

运行本篇中的代码&#xff1a;idea专业版或者idea社区版本&#xff08;2021.1~2022.1.4&#xff09;->这个版本主要是匹配插件spring boot Helper的免费版(衰) 【SSM-Day2】第一个SpringBoot项目 框架->Spring家族框架快速上手Spring BootSpring Boot的作用通过idea创建S…...

【PyTorch】张量操作与线性回归

张量的操作 Tensor Operation 拼接与切分 1.1 torch.cat() torch.cat(tensors, dim0, outNone)功能&#xff1a;将张量按维度dim进行拼接 tensors&#xff1a;张量序列dim&#xff1a;要拼接的维度 1.2 torch.stacok() torch.stack(tensors, dim0, outNone)功能&#xf…...

情感类智能体——你的微信女神

智能体名称&#xff1a;你的微信女神 链接&#xff1a;文心智能体平台AgentBuilder | 想象即现实 (baidu.com)https://agents.baidu.com/agent/preview/RulbsUjIGj4wsinydlBH7AR3NQKFungt 简介 “你的微信女神”是一个直率的智能体&#xff0c;她用犀利而真实的言辞帮助用户…...

基于SpringBoot+Vue+MySQL的养老院管理系统

系统展示 管理员界面 家属界面 系统背景 随着全球人口老龄化的加速&#xff0c;养老院管理面临着前所未有的挑战。传统管理方式存在信息不透明、效率低下、资源分配不均等问题&#xff0c;难以满足日益增长的养老服务需求。因此&#xff0c;开发一套智能化、高效的养老院管理系…...

大数据Flink(一百二十二):阿里云Flink MySQL连接器介绍

文章目录 阿里云Flink MySQL连接器介绍 一、特色功能 二、​​​​​​​语法结构 三、​​​​​​​​​​​​​​WITH参数 阿里云Flink MySQL连接器介绍 阿里云提供了MySQL连接器&#xff0c;其作为源表时&#xff0c;扮演的就是flink cdc的角色。 一、特色功能 MySQ…...

FutureTask源码分析

Thread类的run方法返回值类型是void&#xff0c;因此我们无法直接通过Thread类获取线程执行结果。如果要获取线程执行结果就需要使用FutureTask。用法如下&#xff1a; class CallableImpl implements Callable{Overridepublic Object call() throws Exception {//do somethin…...

Highcharts甘特图基本用法(highcharts-gantt.js)

参考官方文档&#xff1a; https://www.highcharts.com/docs/gantt/getting-started-gantt https://www.highcharts.com/demo/gantt/project-management https://www.hcharts.cn/demo/gantt 链接在下面按需引入 https://code.highcharts.com/gantt/highcharts-gantt.js htt…...

【Linux庖丁解牛】—Linux基本指令(上)!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a; Linux庖丁解牛 &#x1f516;克心守己&#xff0c;律己则安 目录 1、 pwd命令 2、ls 指令 3、cd 指令 4、Linux下的根目录 5、touch指令 6、 stat指令 7、mkdi…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...