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

在这里插入图片描述

文章目录

  • 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.mfbz.cn/a/575427.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

删除docker的容器与镜像

如果您想要卸载通过 docker pull influxdb 命令下载的 InfluxDB 容器,您需要执行以下步骤: 1. **停止正在运行的 InfluxDB 容器**: 首先,您需要停止任何正在运行的 InfluxDB 容器。您可以使用以下命令来查找正在运行的 InfluxD…

Xilinx 7系列 clock IP核的使用(二)

在 Clocking Wizard 中的输出时钟设置部分,主要目的是生成并配置系统所需的特定时钟频率和信号。这一功能在硬件设计和开发中非常关键,因为它允许用户精确地控制各个部分的时钟信号,以满足特定的性能、功耗和时序要求。 1 配置输出时钟 要启…

宝宝洗衣机买什么样的好?诚意推荐四款实力超群的婴儿洗衣机

近几年家用洗衣机标准容积的大大增加,从5Kg、6Kg升级到9Kg、10Kg。大容量洗衣机满足了家庭中清洗大件衣物、床上用品的需求。但由于普通大型洗衣机所洗衣物混杂,很多时候由于宝宝小件衣物数量不多,却也并不适合放在一起扔进大型洗衣机中清洗。…

macOS 一些系统图标的存放位置 icns

macOS 一些系统图标的存放位置 icns macOS 中有很多好看的图标,有时候就想用一下它,我来告诉你他们的具体位置。 系统图标位置,像各种通用文件类型的图标都在这里面,里面好多高清的系统图标 /System/Library/CoreServices/Core…

使用PlantUML绘制活动图、泳道图

最近在学PlantUML 太漂亮了 给大家欣赏一下 我也记录一下 startuml |使用前| start :用户打开旅游App; |#LightSkyBlue|使用后| :用户浏览旅游信息; |#AntiqueWhite|登机前| :用户办理登机手续; :系统生成登机牌; |使用前| :用户到达机场; |登机前| :用户通过安检; |#Light…

快速入门Web开发(中)后端开发(有重点)

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 CSDN 图片导入做的不是很好,因此如果有没有…

这个合租室友真的没有一点公德心,还好他搬走了

这个合租室友真的没有一点公德心,还好他搬走了 这个出租屋有四个房间。 有三个卧室,和一个隔断。 我住三个卧室中的一个。下图中右边那个就是我住的。 2023年下半年,左边那个屋子来了一个新租户小白。 在住的过程中,隔断间的租…

Pulsar Meetup 深圳 2024 会务介绍

“ Hi,各位热爱 Pulsar 的小伙伴们,Pulsar Meetup 深圳 2024 报名倒计时啦,快来报名。这里汇集了腾讯、华为和谙流科技等大量 Pulsar 大咖,干货多多,礼品多多,不容错过啊。 ” 活动介绍 由 AscentStream 谙…

华为ensp中链路聚合两种(lacp-static)模式配置方法

作者主页:点击! ENSP专栏:点击! 创作时间:2024年4月26日11点54分 链路聚合(Link Aggregation),又称为端口聚合(Port Trunking),是一种将多条物理…

C++:拷贝构造函数的初始化列表

拷贝构造函数的初始化列表是在拷贝构造函数的定义中出现的一组初始值,用于初始化新创建的对象的成员变量。它的语法是在构造函数的声明后面使用冒号(:)来开头,然后列出要初始化的成员变量和它们的初始值。初始化列表的优点在于它允…

Linux--进程控制(1)

文章衔接: Linux--环境变量-CSDN博客 Linux--地址空间-CSDN博客 目录 1.进程创建 2.进程的终止 2.1想明白:终止是在做什么? 2.2进程终止的三种情况 2.3 进程如何终止 3.进程等待 (wait/waitpid) 1.进程创建 在li…

vue中form表单中select下拉v-model绑定有数值,但下拉框不显示值的情况

vue中form表单中select下拉v-model绑定有数值,但下拉框不显示值的情况 场景复现: 我将后端获取的数据手动赋值值给select的下拉v-model绑定对象对应的值,但在前端下拉框不显示我赋值的通过v-model给的值,通过控制台打印v-mode的值…

Linux常用监控命令(笔试面试常考)

1.、free命令 [rootRocky8-node1 ~]# free -htotal used free shared buff/cache available Mem: 1.7Gi 1.1Gi 69Mi 31Mi 554Mi 436Mi Swap: 2.0Gi 258Mi 1.7Gi free命令是Linux系统中用…

Java实战:确定给定日期是一年的第几天

本次实战,我们将探讨如何确定给定日期是一年中的第几天。为此,我们提供了三种不同的方法,每种方法都有其独特的实现方式和适用场景。 方法一:不使用数组 这种方法通过Scanner类获取用户的输入,包括年份、月份和日期。…

致远互联 OA fileUpload.do 文件上传漏洞

声明: 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 简介 致远OA是一款企业级办公自动化软件,提供…

使用selenium时出现element click intercepted报错的解决办法

win10,python3.8.10。 selenium版本如下(用pip38 show selenium查看): 在定位中,定位了一个按钮(特点:button下还有span然后才是文本),代码如下: from sele…

科技论文网站:中国科技论文在线

文章目录 1. Intro2. Main3. Cons Evaluation彩蛋:科学素质 这是作者最后一次发这种级别的科普文章 1. Intro 中国科技论文在线是经教育部批准,由教育部科技发展中心主办, 利用现代信息技术手段,打破传统出版物的概念&#xff0c…

苍穹外卖day8(2)用户下单、微信支付

文章目录 前言一、用户下单1. 业务流程2. 接口设计3. 数据库设计3.1 订单表orders3.2 订单明细表 order_detail 4. 代码实现 二、订单支付 前言 用户下单 因为订单信息中包含了其他业务中的数据,在逻辑处理中涉及了多个其他业务,比如要判断地址簿、购物…

基于springboot,vue停车管理系统

目录 项目介绍: 图片展示 运行环境 获取方式 项目介绍: 权限划分:用户和管理员 用户: 具有登录,注册,退出登录的功能 首页:展示一个欢饮页面 个人中心:展示关于个人的信息,以及停车信息…

Unreal Engine创建Plugin

打开UE工程,点击编辑,选择插件 点击“新插件”按钮,选择“空白选项”填入插件名字"MultiPlayerPlugin",填入插件作者、描述,点击“创建插件”按钮打开C工程,即可看到插件目录,编译C工…
最新文章