Spring三级缓存解决循环依赖必要性研讨

c语言面试5(希诺麦田) 在 C 语言中,当使用strlen函数计算字符串的长度时,它会返回字符串中字符的实际个数,不包括字符串结束符’\0’。而sizeof(array)返回的是array指针所占用的字节数,通常在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节。在给定的代码中,array被初始化为"\0\0",其中包含两个转义字符’\0’。当使用strlen函数计算array的长度时,它会遇到第一个’\0’并停止计数,因此返回的长度为 2。12.下面四个选项是四个整数在内存中的存储情况,其中数值最大的一个是。 阅读详情

在这里插入图片描述

由于spring三级缓存处理逻辑的直接读源码比较难理解,所以一气之下按照方法压栈顺序整理了一张图供大家参考;图中各个环节标注了序号,之后的文章我会按照序号来给你标注出代码位置;可以看到整个过程中bean在三级缓存中的状态;

此篇不贴代码的原因是,我认为思想是指导代码的根髓,代码是对思想的表达。所以我们先学习心法,后看招式,不至于走火入魔

注: 虚线的框表示入栈后立马出栈,但是为了对称性,画在对称的位置

在这里插入图片描述

关于三级缓存必要性的讨论

首先对于第二级缓存的作用,都好理解:在bean真正创建完成之前先放在二级缓存中,防止提前暴露到一级缓存,导致并发场景下拿到空壳子下面开始讨论第三级缓存的必要性;

图中可以看到第2步那里是往第三级缓存放入了一个包含对A早期引用进行操作的工厂函数。在第10步的时候才取出来这个函数进行调用。那么如果我直接在第2步就执行这个函数的逻辑,然后把A直接放到2级缓存,废除掉第3级缓存,是不是可以呢?

答案是可以的;

但是为什么没这样做呢:

我们发现对A早期引用进行操作的工厂函数,在没有循环引用的时候甚至都不需要执行。那么spring的第三级缓存,让这段逻辑可执行也可以不执行。
那么这个三级缓存至少达到了一个目的就是,让这段逻辑只在需要执行的时候才会执行;

这段逻辑做了什么事情呢?

如果有代理的话,那么提前对bean进行代理(正常情况下:bean生命周期中一般是要在bean实例化之后才生成代理);

也就是说循环依赖的时候把生成代理的逻辑提前了。那么spring希望bean在的生命周期存在异类吗?显然是不希望的;别无他法的时候它才去这样做;

那么如果只有两级缓存我们该怎么做?

方案1:把代理提前在第二步执行;
那么所有bean生命周期都会是提前进行代理了,缺点 就是:所有的单例bean的代理时机和初始化后才代理设计不符
方案2:把对A早期引用进行操作的工厂函数,也放到二级缓存里面呢
显然这种有可行性,但是二级缓存中又要存工厂函数又要存早期bean。二级缓存担任了多个职责,又显得不够优雅;缺点 就是:二级缓存的职责不明确

所以综上三级缓存尽在可能保证了bean的生命周期的正常的情况下,让每层缓存设计也更加美丽纯净。用深厚的内功耍出来优美的剑术,而且还不至于走火入魔,实在是高超,是剑宗和气宗的势均力敌博弈;

关于网上一些观点的看法:

1.有的说是为了进行aop代理:
反驳:不循环依赖就不需要aop代理了吗?
2.为了解决生命周期的统一
反驳:其实并没有解决生命周期统一。而是尽量解决大部分的是统一的,小部分有循环依赖的并没有解决

集成电路设计笔记(七)UVLO设计 1. 什么是UVLO 欠压锁定(Undervoltage-Lockout)简称UVLO,是电子设备中在电源电压低于正常工程准位时,切断电源的电路。在嵌入式系统中常会用UVLO监控电池电压,若电压低于一定值,会直接切断电源,保护嵌入式系统的电路。 许多电子设备中都有UVLO的功能,例如在镇流器中就有UVLO电路,若电压过低时直接切断电源。 UVLO就是低电压锁定; 低压关断. 欠压关断模式是当供电电压低于IC的开启门限电压时的一种保护模式。欠压关断模式可保证IC在供电电压不足时不致于被损坏。一个低电压锁定( 阅读详情

相关推荐

第12章 STM32+BH1750光照传感器+OLED模块显示环境光照强度

相比光敏传感器,它可以直接输出环境光照强度的数值(范围是0~65535lx),非常适合懒人党,各位的传感器买到手后,赶紧跟着文章试试吧!

qq_44645742的博客 1万+

工程师基本功四大支柱:语言内功、工程化、系统思维与沟通抽象

软件开发基本功是支撑高质量交付的底层能力体系,其核心在于对编程语言运行机制的直觉理解、工程化实践(Git规范、依赖管理、自动化测试、可观测性)、全链路系统思维以及技术到业务的语言转化能力。这些能力共同构成代码可维护性、故障可追溯性与团队协作效率的基础保障。尤其在微服务架构与云原生演进背景下,扎实的基本功比框架熟练度更能决定线上稳定性与迭代速度。本文聚焦Java/Python/Go等主流语言场景下的真实工程痛点,如空指针定位、SQL索引失效、日志缺失traceId、接口变更不同步等典型问题,系统梳理可日常锤炼

unixboy 496

手把手教你学Simulink--单相逆变器模糊逻辑控制策略仿真

本文介绍了在Simulink中设计单相逆变器模糊逻辑控制策略的完整流程。主要包括:1)构建单相逆变器模型;2)使用FuzzyLogicToolbox设计模糊控制器,定义输入输出变量和模糊规则;3)将控制器集成到Simulink模型;4)添加干扰源和示波器;5)配置仿真参数并分析结果。该方法利用模糊控制处理非线性系统的优势,可实现输出电压的精确跟踪,具有良好的鲁棒性。文中提供了详细的步骤说明和示例代码,强调准确设计隶属函数和规则库对控制性能的关键作用。该仿真设计为电力电子控制系统的开发提供了有效支持。

MHD0815的博客 200

Spring源码学习:三级缓存的必要性

工作中可能会碰到循坏依赖问题,所以了解其Spring设计原理,对于解决问题更加高效。在之前的文章中讲解了Spring的代码过程。这篇文章讲解Spring中三级缓存的必要性。

猪大肠的博客 3473

Python爬虫实战【房产刚需专属】:爬取链家/贝壳完整房源数据,精准筛选刚需房源【房价+户型+地段+面积+装修】

本次爬虫的核心亮点就是刚需专属筛选,我已经把刚需买房的主流筛选逻辑封装为独立函数,你只需要修改筛选参数,就能精准匹配你的需求无需懂Python语法,直接改数字/文字即可!本次爬虫是刚需买房+Python爬虫实战的完美结合。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1824

使用GeoServer发布WMS动态地图服务,使用openlayers访问wms服务浏览地图数据

GEOServer是java版开源工具,使用GEOServer简单几步就可以搭建自己的地图服务,与小伙伴们共享地图数据。 一、使用GEOServer发布WMS动态地图服务 大致步骤如下: 1. 新建工作区 左边菜单栏,工作区,新建,起个名字,设置url。 2. 选择数据源 左边菜单栏,选择“数据源”,点击“添加新的数据源”,常用的有shp、postgresql数据库,根据自己的需要选择,这里选择了shp文件源。 选中存放在刚才新建的工作区下面,给数据源起个名字,选择文件本机存放位置,设置编码,包含中文属

从地图看世界的专栏 4540

CPU的一、二、三级缓存

CPU高级缓存,(英语:CPU Cache,在本文中简称缓存)是用于减少处理器访问内存所需平均时间的部件。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近处理器的频率。当处理器发出内存访问请求时,会先查看缓存内是否有请求数据。如果存在(命中),则不经访问内存直接返回该数据;如果不存在(失效),则要先把内存中的相应数据载入缓存,再将其返回处理器。缓存之所以有效,主要是因为程序运行时对内存的访问呈现局部性(Locality)特征。

帝上无天的博客 1万+

高分六号WFV预处理详细步骤(辐射校正、大气校正、几何校正)

高分六号WFV传感器获得的影像的预处理分为两个步骤:辐射校正和大气校正,辐射校正为了消除传感器的自身误差,大气校正为了消除大气的折射误差。 一、辐射校正 按照红框中信息进行更改。 辐射校正前地物光谱反射率: 校正后的地物光谱曲线的变化: 二、大气校正 ENVI中大气校正一般采用Flaash模型,但是这个模型需要设置许多的参数十分的麻烦,所以采用ENVI商店(app store,这个也需要下载的)里的Flaash Easy To Use 这个插件,可以快速地进行大气校正。 大气校正后的地物反射率 这

qq_41828818的博客 1万+

解鞍卸甲——手写简易版Spring框架(终):使用三级缓存解决循环依赖问题

手写简易版Spring框架(终):使用三级缓存解决循环依赖问题

zhang_qing_yun的博客 555

【毕设全程指导】基于YOLOv8的包装商品检测与可视化系统(SKU110K实战)

本文介绍了一个基于YOLOv8的包装商品检测与可视化系统毕业设计方案。项目采用SKU110K数据集,通过CSV转TXT格式转换适配YOLO模型训练,包含详细的环境搭建、模型配置和训练流程。系统实现了包装商品的自动化检测,并开发了Tkinter可视化界面进行交互式检测展示。该方案结合产业应用需求与技术深度,既具备实用价值,又能充分展示学生的技术能力,适合作为计算机视觉相关专业的毕业设计选题。整个项目从数据准备到界面开发完整覆盖,帮助学生系统掌握目标检测项目的完整实现流程。

LXY_LOVE36的博客 147

PyTorch生成式人工智能(1)——神经网络与模型训练过程详解

在本节中,我们介绍了传统机器学习与人工神经网络间的差异,并了解了如何在实现前向传播之前连接网络的各个层,以计算与网络当前权重对应的损失值;实现了反向传播以优化权重达到最小化损失值的目标。并实现了网络的所有关键组成——前向传播、激活函数、损失函数、链式法则和梯度下降,从零开始构建并训练了一个简单的神经网络。

盼小辉丶的博客 1万+

Spring为什么需要使用三级缓存?

Spring为什么需要使用三级缓存? 有如下一个场景,X类中注入了Y类,Y类注入了X类,按照正常的类加载顺序,X类在注入Y的时候其实还没完全初始化完成,而注入的Y此时就开始实例化,发现也需要用到X,这是就去获取X,但是X并没有初始化完成,这个时候就会出现X在等Y初始化完成,而Y又在等X初始化完成,就进入了一个互相等待的情况。 Spring是如何避免这种情况的呢?那就是三级缓存。 先来说说Spring有哪三级缓存。 一级缓存 singletonObject : 单例对象集合; 二级缓存 earlySing

ljcgit的博客 6332

电源芯片MPQ3431A

MPQ3431A是一款具有宽输入范围的固定频率为450kHz的高度集成的升压转换器,其输入电压低至2.7V,采用恒定关断时间(COT)的控制拓扑,可提供快速的瞬态响应。芯片支持通过MODE管脚配置PSM(pulse-skip mode)、FCCM(forced continuous conduction mode)和USM(ultrasonic mode);还支持通过电流限制配置来达到精确的过流保护;同时芯片欠压保护(UVLO)和过温保护(OTP)。MPQ3431A采用QFN-13(3mmx4mm)封装。保

qflook的博客 1559

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

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

Java知音 2906

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

从单体到微服务:Spring Boot 3.x 重构实战与5个核心挑战解析

本文详细解析了从单体架构向微服务架构转型过程中使用Spring Boot 3.x的实战经验,重点探讨了5个核心挑战及其解决方案。内容包括重构前的系统评估、微服务基础架构搭建、数据一致性处理、服务间通信优化等关键环节,为开发者提供了一套完整的软件架构升级方法论。

weixin_30572613的博客 381

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring Cloud Alibaba微服务架构实战:高校会议管理系统设计与实现

微服务架构通过将单体应用拆分为一组小型、独立的服务,每个服务围绕特定业务能力构建,实现了系统的高内聚与低耦合。其核心原理在于服务自治、独立部署和轻量级通信,技术价值体现在提升开发效率、增强系统可扩展性和容错能力。在电商、金融、物联网等复杂业务场景中,微服务能够灵活应对需求变化和技术迭代。本文以高校会议管理系统为例,深入探讨了基于Spring Cloud Alibaba的微服务实践,重点解析了Nacos服务发现与配置中心、Spring Cloud Gateway网关等核心组件的应用,并分享了高并发场景下分布式

weixin_33795743的博客 320

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java全栈面试实战指南:从基础到架构

Java全栈开发涉及从基础语法到分布式架构的完整技术栈。理解HashMap底层原理等核心知识是基础,其通过哈希函数设计、冲突解决机制和扩容策略实现高效键值存储。在并发编程领域,volatile关键字和JMM模型保障了多线程环境下的可见性与有序性。这些技术原理最终服务于高并发订单系统等实际场景,需要结合Redis分布式锁和线程池隔离等方案实现。本指南通过微服务架构设计和秒杀系统案例,展示如何将Java基础、Spring框架与云原生技术融合,构建完整的全栈能力评估体系。

weixin_30800807的博客 503

大厂Java面试深度解析:JVM、高并发与系统设计实战

Java作为企业级开发的核心语言,其技术栈的深度和广度直接影响开发者的职业发展。从JVM内存模型到多线程并发控制,再到分布式系统设计,这些基础概念构成了现代Java工程师的核心能力矩阵。理解ZGC等新一代垃圾回收器的工作原理,掌握ReentrantLock等并发工具的使用场景,能够帮助开发者构建高性能、高可用的系统。在实际工程实践中,这些技术被广泛应用于电商秒杀、金融交易等高压场景。本文通过真实面试案例,详细剖析了头部互联网企业对Java技术深度的考察要点,包括JVM调优、高并发架构设计等热点问题,为开发者

weixin_34372728的博客 437

Spring 三级缓存和循环依赖 思考和总结

写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master 1. 循环依赖 什么是依赖注入?假设有两个类A和B,A在实例化的时候需要B的实例,而B在实例化时又需要A的实例,在类的实例化过程就陷入死循环。这也就是传统逻辑上的,“到底是先有鸡,还是先有蛋”的问题? 下面举一个例子,定义了两个类Type

qwe123147369的博客 903

Spring系列第56篇:一文搞懂spring到底为什么要用三级缓存??

今天来聊一个面试中经常会被问到的问题,咱们一起必须把这个问题搞懂。问题:spring 中为什么需要用三级缓存来解决这个问题?用二级缓存可以么?我先给出答案:不可用。这里先声明下:本文未指明...

路人甲Java 1万+

spring中循环依赖的解决--三级缓存

一、循环依赖的产生和解决的前提 循环依赖的产生可能有很多种情况,例如: A的构造方法中依赖了B的实例对象,同时B的构造方法中依赖了A的实例对象 A的构造方法中依赖了B的实例对象,同时B的某个field或者setter需要A的实例对象,以及反之 A的某个field或者setter依赖了B的实例对象,同时B的某个field或者setter依赖了A的实例对象,以及反之 Spring对于循环依赖的解决...

Mercuriooo的博客 1210

Spring动态代理时是如何解决循环依赖的?为啥用三级缓存?

前言 在研究 『 Spring 是如何解决循环依赖的 』 的时候,了解到 Spring 是借助三级缓存来解决循环依赖的。 同样在上一节留下了疑问: 循环依赖为什么要使用三级缓存?而不是使用二级缓存? AOP 动态代理对循环依赖的有没有什么影响? 本篇文章也是围绕上面的内容进行展开。 笔记也在不断整理,之前可能会有点杂乱。 循序渐进,看一看什么是循环依赖? 先来回顾一下三级缓存的概念。 singletonObjects: 一级缓存,存储单例对象,Bean 已经实例化,初始化完成。 early

weixin_50205273的博客 1553

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

面试官:简历上写了精通Spring,那你回答一下Spring为什么用“三级缓存”去解决循环依赖? 我:.......应该有三个缓存的map结构 面试官:具体回答一下 我:平时没认真深入过 面试官:公司的门在那里,自己走还是我送你? 不知道这道面试题,你是否能回答上来,其实,现在,只要从事Java开发工作,牛逼或者基础,都脱离不开一个架构--ssm,而ssm中,你脱离不开的就是spring的相关知识 很多开发者在开发 Spring 程序的时候,被动接受了已经做好的 Spring 特性案例。虽然.

Java架构师联盟 743

Spring 循环依赖,源码详细分析,真的必须要三级缓存吗?

>>号外:关注“Java精选”公众号,菜单栏->聚合->干货分享,回复关键词领取视频资料、开源项目。写作背景做 Java 开发的,一般都绕不开 Spring,那么面...

Java精选 483

面试题:Spring 为何需要三级缓存解决循环依赖,而不是二级缓存?

来源:cnblogs.com/semi-sub/p/13548479.html前言bean生命周期三级缓存解决循环依赖总结前言在使用spring框架的日常开发中,bean之间的循环依赖太频...

weixin_45727359的博客 9513

spring循环依赖为什么要使用三级缓存

回顾下,源码分析: 这里最重要的就在获取三级缓存时候的 getObject(). 这里获取的是一个 beanFactory,然后具体的执行是下面的代码: 这块是在首次创建bean实例(还没有属性注入)时候,放入的。 这里就是去获取最终对象,也就是代理后的对象。 我们看下getEarlyBeanReference是个什么东西?他是一个函数式接口 @FunctionalInterfacepublic interface ObjectFactory

蓝天白云 5757
下一篇: java快速插入海量数据
掀衣怒码
博客等级 码龄6年 6粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值