Spring循环依赖问题分析

news2024/9/22 17:28:54

文章目录

  • 一、什么是循环依赖?
  • 二、Spring内部解决的是那种情况下的循环依赖?
  • 三、一级、二级、三级缓存保存的是什么?
  • 四、如何使用三级缓存解决循环依赖?
  • 五、为什么是三级缓存,二级缓存不行么?
  • 六、二级缓存的作用是什么?

一、什么是循环依赖?

大白话:就是两个对象相互依赖 A依赖B B依赖A、形成一了个环,没有出口
circle
因为spring当中bean是有生命周期的,大致创建过程:

首先创建A对象,执行A的生命周期

  1. 实例化A,得到一个对象
  2. 填充B,A内部依赖了B,去spring内部的一级缓存中找,没找到就去转到创建B的生命周期
    2.1 实例化B,得到一个对象
    2.2 填充B,发现B内部依赖了A,去spring内部的一级缓存中找没有
    2.3 又转到了A对象的创建,死循环发生
  3. 填充A对象内部的其他属性
  4. 初始化
  5. 放入一级缓存
    在这里插入图片描述

二、Spring内部解决的是那种情况下的循环依赖?

解决的是单例bean下的循环依赖
如下代码:

@Component
public class A {
    //A内部依赖了b属性
	@Autowired
	private B b;
}
@Component
public class B {
	//B内部依赖了a属性
	@Autowired
	private A a;
}

三、一级、二级、三级缓存保存的是什么?

map

四、如何使用三级缓存解决循环依赖?

首先创建A对象,执行A的生命周期

  1. 实例化A,得到一个对象
  2. 将A放入三级缓存,提早暴露
  3. 填充B,A内部依赖了B,去spring内部的缓存中找,没找到就去转到创建B的生命周期
    3.1 实例化B,得到一个对象,同时放入三级缓存
    3.2 填充B,发现B内部依赖了A,去spring内部的缓存中找,此时三级缓存中找到了A
    3.3 如果A需要Aop那从三级缓存里取出来的就是代理对象,否则从三级缓存里取出的就是原始对象(没有经过属性注入的)
    3.4 从三级缓存里取出放到二级缓存中,同时删除三级缓存
    3.5 B进行初始化操作
    3.6 将B放入到一级缓存中去
    3.7 B创建结束,回到A的生命周期
  4. 填充A对象内部的其他属性
  5. 初始化
  6. 放入一级缓存

图示帮助理解:
spring
注意:只有出现了循环依赖的情况下才会用到第二级和第三级缓存

五、为什么是三级缓存,二级缓存不行么?

也行,但是不符合bean的生命周期 (正常spring内部会在一个bean初始化后才会进行Aop)

  1. spring容器内部的bean都是单例的,有可能A这个对象需要被代理,那就需要提前Aop
  2. 如果没有三级缓存,只有二级缓存(value是对象,而不是 ObjectFactory),那么如果存在Aop需要被代理,就需要在存入二级缓存之前先去生成Aop代理对象,这是不合适的。
  3. 三级缓存的存在主要就是需要考虑代理的情况,所以三级缓存的value是ObjectFactory,可以从里面拿到代理对象或原始对象

六、二级缓存的作用是什么?

二级缓存主要是基于性能的考虑,避免频繁的从三级缓存的工厂里创建对象,再放到二级缓存,这样就不需要每次都从工厂里面去拿对象。
比如:

A依赖B,B依赖A
A依赖C,C依赖A

图示帮助理解:
two
完结。

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

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

相关文章

小米AX6S刷OpenWrt,和刷回官网固件

文章目录背景刷成 OpenWrt刷回官网固件Ref简 述: 闲暇,折腾下新购 小米AX6S ,刷下 OpenWrt,初次接触记录下。 本文初发于 “偕臧的小站”,同步转载于此。 背景 miwifi_rb03_firmware_3e872_1.0.54.bin [官方 2022.08.24] miwifi_r…

17. 权重衰退(weight_decay)

之前描述了过拟合的问题,现在介绍一些正则化模型的技术。 正则化:凡事可以减少泛化误差而不是减少训练误差的方法,都可以称作正则化方法。 我们总是可以通过去收集更多的训练数据来缓解过拟合。 但这可能成本很高,耗时颇多&#x…

【OpenCV-Python】教程:4-7 BRIEF( Binary Robust Independent Elementary Features)特征

OpenCV Python BRIEF ( Binary Robust Independent Elementary Features) 【目标】 学习 BRIEF 算法理论 【理论】 我们知道SIFT使用128维向量作为描述符。因为它使用的是浮点数,所以需要512字节。类似地,SURF也需要最少256字…

堪称零瑕疵!仅用了365页直接封神,我要吹爆这份RocketMQ笔记

RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件,作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和高可靠等特性近年来已经也被越来越多的国内企业使用。 谁使用ApacheRocketMQ? …

【不知道发啥】Win7网页版使用方法

文章目录网站使用方法测试总结🌈博客主页:Minecraft__Him 💌欢迎关注🎉点赞👍收藏⭐️私信📝评论 网站 https://win7simu.visnalize.com/ 使用方法 如果是蓝屏那就等一下, 等它跳到这个界面 …

硕士毕业进入阿里三年半,离职申请N+3,到手20多万,跳槽到下家涨薪50%,感谢阿里!...

最近这段时间的负能量帖子太多了,今天说点正能量的事。一位前阿里员工说:硕士3.5年,校招进入阿里供应链后端,月初离职,申请拿了n3,一共给了20多万,跳槽的package涨了50%,感谢阿里&am…

当我和ChatGPT聊Everything as Code

以下是我和ChatGPT的聊天原文。一开始还有点惊喜,震惊。越到后面,越感到失望。网络上大肆宣传ChatGPT要代替人类的文章,我怕是专门炒流量赚钱的吧?我个人觉得,它离代替人类,还远着呢。Everything as Code 的…

Stimulsoft Reports.NET 2023.1.0 Crack

Stimulsoft Reports.NET 是一种为在 Windows 窗体应用程序中集成和工作而创建的报告工具。使用我们的报告工具,您可以创建、编辑、查看、导出和打印任何复杂程度的报告。该产品包括一个功能强大、直观易懂的报表设计器和一个交互式查看器。 最大功能 Stimulsoft Rep…

光储直柔———助力实现零碳电力的新型建筑配电系统

光储直柔———助力实现零碳电力的新型建筑配电系统(2021) [引用本文]江亿.光储直柔———助力实现零碳电力的新型建筑配电系统[J].暖通空调,2021, 21(10): 112. 光储直柔PSDF(phot…

记一次CTF测验(web)

目录 01.php 签到题目 题目描述: 解题: 02.php 11? 题目描述: 解题: 03.php get拿来吧你 题目描述: 解题: 04.php 你从哪里来我的朋友 题目描述: 解题: 05.p…

功能测试(九)—— adb命令、Charles手机抓包

目录 目标 一、APP命令格式 1.1 查看已连接的设备列表 1.2 断开连接设备 1.3 无线连接设备 1.4 开启adb服务 1.5 关闭adb服务 1.6 安装软件包 1.7 卸载软件包 1.8 获取包名 1.9 获取当前窗口(注意大小写区分) 1.10 清除缓存 1.11 启动/停止应用 1.12 获取手机日志…

Verilog语法之条件编译指令`ifdef, `ifndef,`else, `elsif, `endif

0、前言 一般情况下,C语言中的每一行代码都要参加编译。但有时候出于对程序代码优化的考虑,希望只对其中一部分内容进行编译,此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃&…

Canal-1-安装-代码

1总体简介 1 mysql需要开启binlog binlog分类 1.1)statement: 语句级别,binlog 会记录每一次执行写操作的语句。相对于row模式节省空间,但是会产生数据不一致性,例如:update aa set create_timenew(); 如果用binlo…

Java学习笔记7.2.2 事件处理 - Swing常用事件

文章目录零、本讲学习目标一、Swing常用事件二、窗体事件(一)窗体事件概述(二)窗体事件类API概述(三)窗体事件使用方法(四)窗体事件案例演示三、鼠标事件(一)…

【进阶】C语言第一课:深度剖析数据在内存中的存储

目录 前言: 一、数据类型详细介绍: 1.相关知识回顾: 2.类型的基本归类: 整型家族: 浮点型家族: 构造类型: 指针类型: 空类型: 二、整形在内存中的存储: …

PS 更换证件照背景色

哈喽,各位小伙伴!今天我们来学习一下如何更换证件照背景色? 常见证件照 常见的证件照一般有白色、蓝色和红色三种样式,我们拍证件照一般只拍一种,为了节省支出,其他两种颜色就需要我们自己调色处理了 蓝…

计算机毕业设计ssm+vue基本微信小程序的客户资源管理系统

项目介绍 基于Vue技术的客户资源管理系统是对客户的一些资料进行有效的管理, 它将企业的经营管理以客户为中心,通过系统管理员就可以轻松有效的对客户的信息进行操作管理。从而实现客户资料的一致性、准确性,查询的及时性等等。 该系统提供了客户管理、系统管理、合同管理、…

Java学习笔记7.1.2 初探Swing世界 - 布局管理器

文章目录零、本讲学习目标一、布局管理器二、边框布局管理器(BorderLayout)(一)边框布局管理器概述(二)边框布局管理器API文档(三)边框布局管理器使用方法(四&#xff09…

Java项目:SSM在线物流综合管理平台系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台,后台为管理员登录; 管理员角色包含以下功能 管理员登录,管理员管理,合作公司管理,车型信息,货物基本…

MongoDB 数据库安装详细教程

1. MongoDB 下载流程 (急用)直接抵达:Download MongoDB Community Server | MongoDB 打开MongoDB官网:MongoDB (点击进入) 下载完成之后双击打开会出现如下界面: 2. MongoDB 环境配置 通过刚刚的安装知道了MongoDB Se…