【Spring篇 | 补充】三级缓存解决循环依赖

news2025/2/28 19:56:43

在这里插入图片描述

文章目录

  • 7.三级缓存解决循环依赖
    • 7.1何为循环依赖?
    • 7.2三级缓存解析
    • 7.3三级缓存解决循环依赖
      • 7.3.1实例化A
      • 7.3.2创建B的需求
      • 7.3.3实例化B
      • 7.3.4注入A到B
      • 7.3.5B创建完成
      • 7.3.6回溯至A
      • 7.3.7清理二级缓存
    • 7.4为什么不能用二级缓存解决循环依赖?

7.三级缓存解决循环依赖

7.1何为循环依赖?

  • 循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如,A依赖于B,而B又依赖于A。
  • Spring处理:循环依赖在Spring中是允许存在的,因为Spring框架依据三级缓存机制已经解决了大部分的循环依赖问题。

7.2三级缓存解析

  • 一级缓存(singletonObjects):单例池,存放已历经完整生命周期(实例化、注入、初始化)的bean对象。
  • 二级缓存(earlySingletonObjects):缓存实例化完成的bean对象。
  • 三级缓存(singletonFactories):存放ObiectFactory对象,它们能用来创建对应bean的实例。

7.3三级缓存解决循环依赖

Spring 循环依赖流程图

7.3.1实例化A

首先开始实例化beanA,同时在三级缓存中创建一个与A关联的ObiectFactory对象并存入
singletonFactories

7.3.2创建B的需求

A在初始化过程中需要B对象,于是触发B的创建逻辑

7.3.3实例化B

B被实例化完成后,同样会在三级缓存singletonFactories中为其创建一个ObjectFactory。

7.3.4注入A到B

  • 当B需要注入A时,会通过三级缓存中对应的ObiectFactory生成A的对象,并将其存入二级缓存earlySingletonObjects
  • 这里生成的A对象可能是原始对象,也可能是代理对象,关键在于ObjectFactory都能胜任生产任务。

7.3.5B创建完成

  • B成功从二级缓存
    earlySingletonObiects获取到A对象并完成注入,此时B创建完毕,被放入一级缓存singletonObiects。

7.3.6回溯至A

  • 回到A的初始化过程,由于B现在已存在于一级缓存中,A可以直接注入B,完成自身的初始化,

7.3.7清理二级缓存

  • 最后,二级缓存中用于临时存储的A对象会被清除,确保缓存状态的整洁。

7.4为什么不能用二级缓存解决循环依赖?

  1. 其实二级缓存同样也能很好解决循环引用问题。

  2. 使用三级而非二级缓存并非出于IOC的考虑,而是出于AOP的考虑,即若使用二级缓存,在AOP情形下注入到其他bean的,不是最终的代理对象,而是原始对象

  3. 循环依赖下,有没有代理情况下的区别就在:

    singletonObject = singletonFactory.getObject();
    

    在循环依赖发生的情况下 B 中的 A 赋值时:

    1. 无代理:getObject 直接返回原来的 Bean
    2. 有代理:getObject 返回的是代理对象

    然后都放到二级缓存

    image-20240425084406602

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

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

相关文章

【漏洞复现】通天星CMSV6车载监控平台ids SQL注入漏洞

漏洞描述: 通天星CMSV6车载定位监控平台拥有以位置服务、无线3G/4G视频传输、云存储服务为核心的研发团队,专注于为定位、无线视频终端产品提供平台服务,通天星CMSV6产品覆盖车载录像机、单兵录像机、网络监控摄像机、行驶记录仪等产品的视频…

微信小程序4~6章总结

目录 第四章 页面组件总结 4.1 组件的定义及属性 4.2 容器视图组件 4.2.1 view 4.2.2 scroll-view 4.2.3 swiper 4.3 基础内容组件 4.3.1 icon ​编辑 4.3.2 text 4.3.3 progress ​编辑 4.4 表单组件 4.4.1 button 4.4.2 radio 4.4.3 checkbox 4.4.4 switch …

网工学习云计算HCIE感受如何?

作为一名网工,我经常会在各种网络论坛里查询搜索一些网络技术资料,以及跟论坛里的网友交流讨论平时在工作、学习中遇到的问题、故障,因此也经常能在论坛的首页看到誉天的宣传信息。机缘巧合之下关注了誉天的B站号,自从关注了誉天的…

用 LMDeploy 高效部署 Llama-3-8B,1.8倍vLLM推理效率

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

嵌入式Linux driver开发实操(十八):Linux音频ALSA开发

应用程序程序员应该使用库API,而不是内核API。alsa库提供了内核API 100%的功能,但增加了可用性方面的主要改进,使应用程序代码更简单、更美观。未来的修复程序或兼容性代码可能会放在库代码中,而不是放在内核驱动程序中。 使用ALSA API和libasound进行简单的声音播放: /*…

Gartner发布攻击面管理创新洞察:CTEM、VA、EASM、CAASM、ASA、DRPS、BAS、VM等攻击面管理相关技术及关系

安全运营团队负责管理跨内部和外部数字资产的复杂攻击面。这项研究概述了攻击面评估空间,以帮助安全和风险管理领导者驾驭技术并改善其安全状况。 主要发现 随着本地和云中的技术环境变得越来越复杂和分散,组织必须管理不断增长的攻击面。 SaaS 应用程序…

wps/word中字体安装教程

问题:下载的字体怎么导入wps/word wps或word中没有相应字体,怎么导入。其实方法很简单。 Step 1:下载字体 首先,在网上搜索自己喜欢的字体,然后下载到本地。字体的格式通常是.ttf 下面是我网上找的字体&#xff08…

2024年度西安市创新联合体备案申报条件时间要求须知

一、申报条件 组建市级创新联合体需具备牵头单位、成员单位、组建协议、首席科学家等四个条件。 (一)牵头单位 1.牵头单位应为在西安市注册登记的省市产业链龙头骨干企业,重点支持市级重点产业链“链主”企业; 2.牵头单位一般为1家。 (二)成员单位 1.成员单位…

2024最新版JavaScript逆向爬虫教程-------基础篇之JavaScript密码学以及CryptoJS各种常用算法的实现

目录 一、密码学介绍1.1 为什么要学密码学?1.2 密码学里面学哪一些 二、字符编码三、位运算四、Hex 编码与 Base64 编码4.1 Hex 编码4.2 Base64 编码 五、消息摘要算法5.1 简介5.2 JS中的MD5、SHA、HMAC、SM3 六、对称加密算法6.1 介绍6.2 加密模式和填充方式6.3 CryptoJS 中D…

代理IP干货:如何正确使用防范风险?

在今天的数字时代,代理IP地址已成为互联网世界中不可或缺的一部分。无论您是寻求绕过地理限制、保护个人隐私还是执行网络任务,代理IP地址都发挥着关键作用。我们将为您探讨代理IP地址的重要性以及如何防范潜在的风险和威胁。 一、代理IP地址的潜在风险 …

CUDA编程技术概述

CUDA(Compute Unified Device Architecture,统一计算设备架构)是由英伟达(NVIDIA)公司推出的一种软硬件集成技术,是该公司对于GPGPU(通用图形处理器计算)的正式名称。透过这个技术&a…

微信小程序用户隐私协议保护指引自定义组件封装

这是一个微信小程序用户隐私协议保护指引自定义组件封装详细教程及代码。【建议收藏】 在做微信小程序有涉及表单提交,涉及用户信息收集时。提交代码会审核不过。 有需要了解到文档:https://developers.weixin.qq.com/miniprogram/dev/framework/user-pr…

超分辨率遥感图像去云的扩散增强训练

GitHub - littlebeen/Cloud-removal-model-collection: A collection of the existing end-to-end cloud removal model readme 云恢复的扩散增强 基于ADM的超分辨率遥感图像去云扩散增强算法。 几种传统的CR模型可以参考https://github.com/littlebeen/Cloud-removal-model-co…

短链接推荐:一个可以监测用户行为的“营销神器”

客户对我的推广有兴趣吗?他喜欢我的产品吗?他打开了我的营销信息吗?这三个问题相信每一位推广者都遇到过。接下来,就将给大家介绍一位大聪明——它能帮你监测每一位用户的行为,让你分分秒秒掌握用户的心理!…

深入了解Redis内存淘汰策略中的LRU算法应用

LRU算法简析 LRU(Least Recently Used,最近最少使用)算法是一种常见的内存淘汰策略,它根据数据的访问时间来决定哪些数据会被淘汰。LRU算法的核心思想是:最久未被访问的数据,被认为是最不常用的数据&#…

UE5 GAS开发P41-43 永久效果,去除永久效果,伤害区域,EnumClass,开始重叠与结束重叠事件

这一部分学习了怎么创建一个伤害性的地形(火焰地形,毒沼泽等都可以用这个方式创建) AuraEffectActor.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "GameplayEffect.h&q…

Linux驱动开发:掌握SPI通信机制

目录标题 1、SPI简介2、SPI通信机制3、Linux内核中的SPI支持4、SPI核心API5、SPI控制器驱动6、SPI设备驱动 7、编写SPI设备驱动8、调试SPI驱动 在Linux驱动开发中,串行外设接口(SPI)是一种常见的高速全双工通信协议,用于连接处理器和各种外设。本文将深入…

React【Day4下+5】

环境搭建 使用CRA创建项目,并安装必要依赖,包括下列基础包 Redux状态管理 - reduxjs/toolkit 、 react-redux路由 - react-router-dom时间处理 - dayjsclass类名处理 - classnames移动端组件库 - antd-mobile请求插件 - axios pnpm i reduxjs/toolkit r…

企业规模扩大,SD-WAN实现跨省快速组网

随着数字化时代的飞速发展,企业面临着前所未有的挑战与机遇。5G、VoIP、AI和物联网等新技术的兴起,不仅改变了商业格局,也对企业网络提出了更高的要求。随着企业规模的不断扩大,企业如何搭建跨省的、高性能、超融合、简化运维的组…

防火墙技术基础篇:认识安全策略、安全区域、域间转发及报文转发流程

防火墙技术基础篇:认识安全策略、安全区域、域间转发及报文转发流程 一、安全策略匹配机制 简单通俗的讲,防火墙设备最基本的用途就是定义数据如何转发,靠什么定义呢?最基本的就是安全策略,当流量来到防火墙之后首先…