【Spring】循环引用 解决流程,只用一二级缓存?

文章目录

  • 循环引用
    • 循环引用
    • 循环引用解决流程
    • 为什么不只用一二级缓存?:red_circle:

循环引用

循环引用

循环依赖:循环依赖其实就是循环引用,也就是bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A

循环依赖在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依赖

  1. 三级缓存

    • 一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象

    • 二级缓存:缓存早期的bean对象(生命周期还没走完)

    • 三级缓存:缓存的是ObjectFactory,表示对象工厂,可以用来在需要时生成Bean的代理对象。(lambda表达式),打破循环

  2. creatingSet

    • Spring使用creatingSet来存储当前正在创建的Bean的Set,用于判断是否出现循环依赖。

    • 当检测到循环依赖时,Spring会从二级缓存中寻找半成品Bean,或者从三级缓存中获取Bean对应的Bean工厂对象(如lambda表达式)。

  3. earlyProxyReferences

    • earlyProxyReferences用于存储那些因为循环依赖而提前进行了AOP处理的Bean。

    • 通过这个Set,Spring可以避免在Bean初始化完成后,重复在beanPostProcessAfterInitialization()方法中对已经AOP过的对象再次进行AOP操作。

  4. @Lazy解决循环依赖

    • 使用@Lazy注解,Spring通过CGLib生成代理对象,在依赖注入时延迟加载Bean,避免Bean生命周期中的循环依赖问题。

    • @Lazy通过代理对象的方式,使得Bean在需要时才初始化,解决了Bean的循环依赖问题。

  5. 综合机制

    • 三级缓存creatingSetearlyProxyReferences@Lazy代理机制,加上Spring的AOP处理,五者共同作用,才能真正彻底解决循环依赖的问题。

这里@Lazy注解底层就是用aop生成的代理对象,最后走的createAopProxy方法

构造器初始化,会把依赖注入提前,获取不到实例A对象

在这里插入图片描述

循环引用解决流程

  1. 先实例A对象,同时会创建ObjectFactory对象存入三级缓存singletonFactories
  2. A在初始化的时候需要B对象,这个走B的创建的逻辑
  3. B实例化完成,也会创建ObjctFactory对象存入三级缓存singletonFactories
  4. B需要注入A,通过三级缓存中获取ObjectFactory来生成一个A的对象同时存入二级缓存,这个是有两种情况,一个是可能是A的普通对象,另外一个是A的代理对象,都可以让ObjectFactory来生产对应的对象,这也是三级缓存的关键
  5. B通过从通过二级缓存 earlySingletonObjects 获得到A的对象后可以正常注入,B创建成功,存入一级缓存singletonObjects
  6. 回到A对象初始化,因为B对象已经创建完成,则可以直接注入B,A创建成功存入一次缓存singletonObjects
  7. 二级缓存中的临时对象A清除

为什么不只用一二级缓存?🔴

Spring在循环依赖中不能只使用一、二级缓存,主要原因是三级缓存中的**ObjectFactory**(用于延迟创建代理对象)是关键。

如果只用一、二级缓存:

  • 代理对象必须在创建Bean的早期阶段就生成,而代理的生成通常需要等到Bean的后置处理器(BeanPostProcessor)完成后才能进行。
  • 三级缓存通过ObjectFactory延迟生成代理对象,确保在Bean初始化过程中按需创建代理,避免提前或重复生成代理对象。

因此,三级缓存用于处理AOP代理的延迟创建,确保在复杂依赖场景下正常注入Bean,避免提前生成或重复AOP增强。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【青牛科技】视频监控器应用

1、简介: 我司安防产品广泛应用在视频监控器上,产品具有性能优良,可 靠性高等特点。 2、图示: 实物图如下: 3、具体应用: 标题:视频监控器应用 简介:视频监控器工作原理是光&#x…

机器学习day5-随机森林和线性代数1最小二乘法

十 集成学习方法之随机森林 集成学习的基本思想就是将多个分类器组合,从而实现一个预测效果更好的集成分类器。大致可以分为:Bagging,Boosting 和 Stacking 三大类型。 (1)每次有放回地从训练集中取出 n 个训练样本&…

5G与4G互通的桥梁:N26接口

5G的商用部署进程将是一个基于4G系统进行的长期的替换、升级、迭代的过程,4G系统是在过渡到5G全覆盖过程中,作为保障用户业务连续性体验这一目的的最好补充。 因此4G/5G融合组网,以及互操作技术将是各大运营商在网络演进中需要重点考虑的问题…

统信UOS开发环境支持Golang

UOS为Golang开发者提供了各种编辑器和工具链的支持,助力开发者实现高质量应用的开发。 文章目录 一、环境部署Golang开发环境安装二、代码示例Golang开发案例三、常见问题1. 包导入错误2. 系统资源限制一、环境部署 Golang开发环境安装 golang开发环境安装步骤如下: 1)安装…

【c++丨STL】list的使用

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C、STL 目录 前言 list简介 一、list的默认成员函数 构造函数(constructor) 析构函数 赋值重载 二、list的迭代器接口 迭代器的功能分类 三、list的容量…

如何解决JAVA程序通过obloader并发导数导致系统夯住的问题 | OceanBase 运维实践

案例背景 某保险机构客户的数据中台,自系统上线后不久,会定期的用 obload 工具从上游业务系统导入数据至OceanBase数据库。但,不久便遇到了应用服务器的 Memory 与 CPU 资源占用持续攀升,最终导致系统夯住而不可用的异常。 memo…

人工智能:塑造未来的工作与生活

目录 人工智能技术的应用前景与影响 人工智能的历史与现状 人工智能的应用领域 人工智能的前景与挑战 个人视角:人工智能的应用前景与未来 人工智能在生活中的潜力 面对人工智能带来的挑战 我的观点与建议 结语 人工智能技术的应用前景与影响 随着人工智能…

MATLAB绘制克莱因瓶

MATLAB绘制克莱因瓶 clc;close all;clear all;warning off;% clear all rand(seed, 100); randn(seed, 100); format long g;% Parameters u_range linspace(0, 2*pi, 100); v_range linspace(0, pi, 50); [U, V] meshgrid(u_range, v_range);% Parametric equations for t…

go-zero(二) api语法和goctl应用

go-zero api语法和goctl应用 在实际开发中,我们更倾向于使用 goctl 来快速生成代码。 goctl 可以根据 api快速生成代码模板,包括模型、逻辑、处理器、路由等,大幅提高开发效率。 一、构建api demo 现在我们通过 goctl 创建一个最小化的 HT…

鸿蒙原生应用开发元服务 元服务是什么?和App的关系?(保姆级步骤)

元服务是什么?和App的关系? 元服务是是一种HarmonyOS轻量应用形态,用户无需安装即可使用,具备随处可及、服务直达、自由流转的特征。 元服务是可以独立部署和运行的程序实体,独立于应用,不依赖应用可独立…

k8s上部署redis高可用集群

介绍: Redis Cluster通过分片(sharding)来实现数据的分布式存储,每个master节点都负责一部分数据槽(slot)。 当一个master节点出现故障时,Redis Cluster能够自动将故障节点的数据槽转移到其他健…

智慧环保平台_大数据平台_综合管理平台_信息化云平台

系统原理   智慧环保是新一代信息技术变革的产物,是信息资源日益成为重要生产要素和信息化向更高阶段发展的表现,是经济社会发展的新引擎。   现今,环保信息化建设进入高速发展阶段。在此轮由物联网掀起的信息浪潮下,环境信息…

《通往人工智能深度学习专家之路:全面解析学习路线图》

《通往人工智能深度学习专家之路:全面解析学习路线图》 一、人工智能深度学习简介1.1 人工智能与深度学习的关系1.2 深度学习的应用领域1.3 深度学习的重要性 二、深度学习路线图总览2.1 学习路线图的结构2.2 各阶段学习目标与重点 三、深度学习基础阶段3.1 数学基础…

Git 分⽀规范 Git Flow 模型

前言 GitFlow 是一种流行的 Git 分支管理策略,由 Vincent Driessen 在 2010 年提出。它提供了一种结构化的方法来管理项目的开发、发布和维护,特别适合大型和复杂的项目。GitFlow 定义了一套明确的分支模型和工作流程,使得团队成员可以更有效…

任务管理功能拆解——如何高效管理项目任务?

在项目管理中,任务管理功能不仅仅是一个操作工具,它是确保项目按时、高效完成的核心所在。无论是小团队还是跨部门合作,任务管理能够帮助项目经理和团队成员清晰地看到每一项任务的执行情况和进度,从而合理调配资源、优化工作流程…

nodejs入门(1):nodejs的前后端分离

一、引言 我关注nodejs还是从前几年做了的一个电力大数据展示系统开始的,当然,我肯定是很多年的计算机基础的,万变不离其宗。 现在web网站都流行所谓的前后端结构,不知不觉我也开始受到这个影响,以前都是前端直接操作…

集群聊天服务器(13)redis环境安装和发布订阅命令

目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的,还可以存链表、数组等等复杂数据结构 而且数据是在…

深入解析大带宽服务器:性能优势与选择指南

一、大带宽服务器是什么? 大带宽服务器指的是具备高网络带宽能力的服务器,通常提供1Gbps、10Gbps甚至更高的网络连接能力。与普通带宽服务器相比,大带宽服务器能够在更短时间内传输大量数据,因此常用于高流量、高并发需求的场景&…

关于Qt C++中connect的几种写法

目录 1. 传统的槽函数写法 2. 使用函数指针的connect写法(5.0) 3. Lambda表达式作为槽函数(C11) 4.使用QOverload选择重载信号的写法 这connect函数就像是编程世界里的“茴”字,千变万化,各有千秋。咱们…

常见网络厂商设备默认用户名/密码大全

常见网络厂商的默认用户名/密码 01 思科 (Cisco) 设备类型:路由器、交换机、防火墙、无线控制器 默认用户名:cisco 默认密码:cisco 设备类型:网管型交换机 默认用户名:admin 默认密码:admin 02 华…