面试官:连Spring三级缓存都答不好,自己走还是我送你?

spring三级缓存解决循环依赖 spring, 三级缓存,循环依赖 阅读详情

最近很多水友在后台留言问:

Spring的循环依赖问题,这也是最近两年新出的面试频度较高的面试题!

下面我们就通过这篇文章让大家了解循环依赖的问题

什么是循环依赖?

循环依赖其实是指两个及以上bean相互持有对方,最终形成闭环的过程(一般聊循环依赖都是默认的单例bean),简单说就是A依赖B,B依赖C,C又依赖A。

其实在Spring中,有两种循环依赖的场景...

  • 第一种:构造器的循环依赖

  • 第二种:setter的依赖注入

第一种是没有办法解决的,而第二种可以使用提前暴露对象的方式进行解决

那么肯定有很多小伙伴会有疑问,为什么?

其实想搞明白这个问题,需要对Spring的Bean的生命周期有一个完整的了解,如下图:

大家可能对这个图不太熟悉,但是我要强调的是,图中我已经用三种颜色标识了,除了使用这部分之外,可以分为实例化和初始化,这也是解决问题的核心。

同时,Spring中还使用了三级缓存来解决问题:

上图就是Spring中的三级缓存,那么问题来了

  • Spring是如何通过三级缓存来解决问题的?

  • 一级缓存能不能解决?为什么?

  • 二级缓存能不能解决?为什么?

  • 为什么非要使用三级缓存?使用三级缓存是为了解决什么问题?

题外话:这些问题是为什么呢?来往下看

最近小编在跟马士兵老师聊天过程中,得知要开一个《大厂必备Spring》训练营

时间:7月16日-7月17日 两天,晚20:00开始

题外话:每天两小时直播,免费,诚意够不够?

如何参加?

扫码加小助手,获取直播地址,另送架构师成长路线图

内容大纲如何?

第一天:

  • 如何利用反射实现Autowired注解

  • 一招教你如何手撕SpringIOC源码

  • Spring程序是如何启动的?

  • Spring是如何加载配置文件到应用程序的?

  • 掌握核心接口BeanDefinitionReader

  • 掌握核心接口BeanFactory

  • 彻底搞懂Spring的refresh方法

  • BeanPostProcessor接口的作用及实现

  • BeanFactoryPostProcessor接口的作用及实现

第二天:

  • Spring Bean有没有必要实现Aware接口

  • Spring Bean的实例化过程大揭密

  • Spring Bean的初始化到底干了什么

  • 彻底理解FactoryBean接口

  • 完美解析Spring Bean的生命周期

  • Spring的Environment接口有什么作用?

  • 为什么产生循环依赖问题

  • 循环依赖在Spring中是如何解决的

  • 如何巧妙回答Spring IOC面试题

主讲老师?

连续两天(7月16日-7月17日)每天2小时(20:00-22:00),免费听《大厂必备Spring》,干货满满,只能帮到你这里了,快去一起学习吧...

另外准备一份干货满满的学习资料,送给大家,抓紧领取...

如何领取?

扫码加小助手,获取直播地址,另送架构师成长路线图

Spring为什么需要三级缓存?二级缓存能解决循环依赖吗? A创建时—>需要B---->B去创建—>需要A,从而产生了循环什么情况下循环依赖可以被处理?从上面的测试结果我们可以看到,不是只有在setter方法注入的情况下循环依赖才能被解决,即使存在构造器注入的场景下,循环依赖依然被可以被正常处理掉。面试官:”Spring是如何解决的循环依赖?答:Spring通过三级缓存解决了循环依赖,其中一级缓存为单例池(),二级缓存为早期曝光对象,三级缓存为早期曝光对象工厂( 阅读详情

相关推荐

使用CLion在Window端进行linux开发

        以往不管是开发x86端linux程序还是arm端linux程序,都是使用Source Insight作为源码编辑工具的,如下图      去年底,发现CLion的2018.3更新版本,可以支持remote host开发了,大爱!     我是基于以下几点原因,将开发工具换成CLion 1. 语法高亮较明显、跳转、重构方便(我很看重这个); 2. 可以使用图形界面进行调...

alist的笔记专栏 1万+

Spring——三级缓存解决循环依赖详解

结合Spring源码分析三级缓存分别是什么?在哪里产生?一张图搞清楚到底是怎么解决循环依赖的?一张图搞清楚二级缓存行不行?

共勉 2万+

Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)

目录1 编译 Matterport3D Simulator 源码1.1 源码下载1.2 编译 1 编译 Matterport3D Simulator 源码   在 Windows 下编译 Matterport3D Simulator 稍微有些不方便,需要对 CMakeLists.txt 进行一些修改,如果有更好的方法欢迎大家评论。 1.1 源码下载   还是直接在 Github 上搜索 Matterport3D Simulator 的 repo,下载源码。如果用 zip 方式,那么直接在下即可。如果使用

weixin_44110393的博客 4846

【源码+个人总结】Spring 的 三级缓存 解决 循环依赖

看三级缓存源码,确认解决循环依赖的过程

Du939的博客 1564

飞腾D2000 BIOS编译避坑指南:PCIE拆分、S3电源与过温保护配置详解

本文详细解析飞腾D2000 BIOS编译中的关键配置技巧,包括PCIE拆分模式优化、S3电源管理适配及过温保护设置。通过实战案例和参数调优建议,帮助开发者规避常见陷阱,充分发挥国产高性能计算平台的硬件潜力。特别针对BIOS编译过程中的隐蔽问题提供解决方案。

weixin_33704234的博客 535

一文读懂AI协同办公领域发展和趋势

协同办公,又称OA,是指企业内部或外部各类人员之间利用信息技术来进行协作工作的一种形式。这种协作工作既可以由直接员工进行,也可以来自外部的咨询机构、合作伙伴或联营企业。协同办公的优势在于可以对资源进行有效管理和配置,各部门之间可以建立良好的协作关系,跨部门更好地实现资源共享。

女王の专属领地 2365

Spring三级缓存解决循环依赖问题

解析理解在互相依赖的 Bean 是单例的、依赖注入的方式不都是构造注入的前提下如何使用三级缓存解决Spring中的循环依赖的问题。

trong_ 的烂笔头 6229

基于Transformer的股票市场多因子量化选股模型,深度解析:基于Transformer的股票市场多因子量化选股模型

传统多因子模型通常采用线性回归、岭回归或Lasso回归来估计因子权重,其核心假设是因子与未来收益之间存在线性关系。然而,现实中的股票市场具有典型的非线性、非平稳和高噪声特征。卷积神经网络(CNN)擅长提取局部特征,但难以捕捉全市场股票之间的全局依赖关系;循环神经网络(RNN)及其变体LSTM虽然能处理时间序列,但存在梯度消失问题且难以并行计算。Transformer的self-attention机制能够:直接建模任意两只股票之间的相关性动态计算因子权重而非静态线性组合。

YOLO 251

Spring大白话--三级缓存解决循环依赖问题

在使用Spring 开发过程中,我们需要对定义后的bean 通过构造方法,或者bean 注入的方式注入到某个类中进而使用改bean 对应的方法,在此过程中就会出现一个类中注入了n多个bean,几个类中bean 相互注入,出现 A 依赖B,B依赖C,C又依赖A/B 这种循环情况的出现。提示:以下是本篇文章正文内容,下面案例可供参考。

拽着尾巴的鱼儿的博客 4912

【100%通过率】华为OD机试真题 C++ 实现【打印机队列】【2022.11 Q4 新题】

有5台打印机打印文件,每台打印机有自己的待打印队列。因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的代先级,其中数字越大优先级越高。打印机会从自己的待打印队列中选择优先级最高的文件来打印。如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。现在请你来模拟这5台打印机的打印过程。

MISAYAONE的博客 9947

vue3 - 详细实现视频/图片/图文“响应式瀑布流“列表布局示例代码,手机移动端H5或PC端电脑网页根据屏幕宽度自适应响应式瀑布流效果,支持数据列表动态懒加载,仿小红书图文视频div容器的瀑布流方案

vue3,nuxt3,瀑布流,响应式,图片瀑布流,视频瀑布流,图文瀑布流,手机移动端,H5瀑布流,电脑PC网站,手机电脑都能用的瀑布流布局,屏幕自适应,最好用的瀑布流组件插件,滚动分页加载瀑布流列表,瀑布流效果,自适应瀑布流布局详细教程,动态加载数据,懒加载,小红书,图文列表,视频列表,列表容器高度不一致怎么排列,整个屏幕全是宽高不固定的div容器列表怎么办,移动端和pc端双端实现瀑布流,vue3实现图片瀑布流布局以及响应式,滚动条触底懒加载,组件插件,vue3瀑布流 电脑手机都能用,解决卡顿不流畅,对不齐

✅ 精选推荐文章 4341

Spring循环依赖以及为什么需要三级缓存

什么是循环依赖? A创建时—>需要B---->B去创建—>需要A,从而产生了循环 什么情况下循环依赖可以被处理? 从上面的测试结果我们可以看到,不是只有在setter方法注入的情况下循环依赖才能被解决,即使存在构造器注入的场景下,循环依赖依然被可以被正常处理掉。 三级缓存 三级缓存是通用的叫法。 如果只有一级缓存 实例化A对象。 填充A的属性阶段时需要去填充B对象,而此时B对象还没有创建,所以这里为了完成A的填充就必须要先去创建B对象; 实例化B对象。 执行到B对象的填充属性阶

qq_40277163的博客 1万+

【TC397第2篇】TC397 EB MCAL开发指南:ADS MCAL Demo集成深度解析

通过本文的指导,我们完成了TC397 EB MCAL与ADS的深度集成,并成功运行了一个简单的MCAL Demo。这个案例不仅帮助我们理解了MCAL在实际开发中的应用,同时也展示了ADS作为一个强大的开发工具在嵌入式系统开发中的优势。在接下来的系列文章中,我们将进一步探讨MCAL的高级应用、优化技巧以及更多实用的开发案例。敬请关注,共同探索TC397 EB MCAL开发的更多精彩!

一直在水些技术小文 453

Spring 的循环依赖:真的必须非要三级缓存吗?

作者:青石路www.cnblogs.com/youzhibing/p/14337244.html写作背景做 Java 开发的,一般都绕不开 Spring,那么面试中肯定会被问到 Sprin...

Java知音 2906

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

100%吃透Spring 的三级缓存

在此之前,我们需要了解什么是spring的循环依赖,下面我引用一篇之前的文档然后带你从源码级别debug,一步一步带你探索Spring是如何通过三级缓存来解决循环依赖问题的首先先创建两个类,分别是类A和类B,然后定义好get和set方法和无参数构造下一步通过spring容器注入两个bean。

o0oho的博客 2090

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Spring三级缓存解密: 循环依赖必须用三级缓存吗?二级缓存行不行?

*** 创建Bean的核心流程*///// // 1. 实例化: 创建Bean实例(原始对象)//// // 2. 放入三级缓存(如果允许早期引用)// // 这个lambda就是三级缓存的ObjectFactory// // 调用时会经过SmartInstantiationAwareBeanPostProcessor// // 可能返回原始对象或AOP代理// });// }//// // 3. 属性填充(这里可能触发其他Bean的创建,形成循环依赖)//

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1509

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

面试官:Spring 循环依赖怎么破? 三级缓存:我来Carry!

想象一下,你有两个好朋友:小明 👦 和小红 👧。小明说:“我需要小红 👧 帮我做作业 ✍️,才能完成我的作业。小红说:“我需要小明 👦 帮我整理笔记 📒,才能完成我的笔记。这就尴尬了!🤦‍♂️ 小明等小红,小红等小明,谁也完不成自己的任务。这就是循环依赖,也叫循环引用。

qq_56158663的博客 1183

面试官:Spring解决循环依赖一定需要三级缓存吗?

我是大明哥,一个专注 [] 的硬核程序员。

chenssy 的技术博客 1385

面试官:Spring是如何解决循环依赖的,一定需要三级缓存吗?

Component@Autowired// A依赖B@Component@Autowired// B依赖A。但实际开发中,Spring却成功解决了这个问题!它的秘密武器就是三级缓存。Spring通过三级缓存+提前暴露半成品对象解决循环依赖问题,核心目的是处理AOP代理对象的唯一性。虽然理论上两级缓存可以解决部分场景,但三级缓存是Spring设计上的必要选择。理解这一机制,不仅能应对面试,还能在遇到相关Bug时快速定位原因!

Like0703的博客 1225

面试官:Spring 的循环依赖怎么解决的,为什么需要加个三级缓存,二级不行么?

hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶Spring 解决循环依赖的核心机制是,其设计目的是在保证 Bean 生命周期完整性的同时,安全地处理循环引用。假设只有二级缓存(通过fill:#333;1. 开始创建A,实例化后放入三级缓存(ObjectFactory)2. 准备属性注入,发现依赖B3. 创建B4. 实例化B,放入三级缓存5. 注入属性,发现依赖A6. 从三级缓存获取A的ObjectFactory。

牛马baby的博客 1117

Spring为什么需要三级缓存

Spring三级缓存机制解析:解决循环依赖与AOP的关键设计 摘要: Spring采用三级缓存机制主要解决循环依赖问题,同时确保AOP等功能的正确性。一级缓存存放初始化完成的Bean,二级缓存存放早期暴露的未完全初始化Bean,三级缓存则存放Bean工厂对象。关键区别在于:二级缓存是静态对象级,而三级缓存的工厂能动态生成代理对象。这种分层设计保证了职责单一、生命周期清晰,避免混用导致的管理混乱。当需要AOP代理时,三级缓存的工厂能延迟决定返回原始对象还是代理对象,解决了二级缓存无法处理动态代理的问题。测试代

2401_82689064的博客 715

Spring 三级缓存能不能解决循环依赖?

最近也是面试的时候遭到了面试官对 Spring 一些方面狠狠的拷打,现在整理如下,供大家参考。

qq_74212030的博客 1234
上一篇: 使用 WebSocket 打造网页 IM 聊天,看不懂就锤爆艿艿的狗头~
下一篇: Linux 最常用命令:简单易学,但能解决 95% 以上的问题
公众号-芋道源码
博客等级 码龄10年 1635粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值