面试题 : Spring循环依赖问题及其解决方案

news2024/7/6 17:46:40

一级缓存,存在循环依赖问题

一级缓存的作用

一级缓存就是singletonObjects(单例池) : 作用就是保证单例,里面放的是成品对象

在这里插入图片描述
循环依赖问题
在这里插入图片描述

  • 假设有两个类A, B ,然后A依赖B, B依赖A
  • 此时在spring 容器中一级缓存的工作流程是:
    (1)、首先在单例池中找,一开始是没有的
    (2)、然后就创建A对象, 依赖注入B, 但是由于B在单例池中也没有, 所有会调用B的初始化
    (3)、同样B会创建B对象, 需要注意的是B也依赖A, 此时由于a还未初始化,单例池中没有A,就会重复上一步
    (4)、这样就陷入了死循环

二级缓存,解决循环依赖问题

解决一般循环依赖问题
在这里插入图片描述

  • 二级缓存解决循环依赖的流程

首先在单例池中找A,一开始是没有的
然后创建A对象,并把A对象(半成品,因为没有初始化以及bean后置处理器加工) 放入二级缓存中
此时依赖注入B, 就会去一级缓存中查看, 发现没有, 就去调用getBean(B)
B对象同样会把半成品放到二级缓存中,然后依赖注入A去二级缓存中拿到半成品A然后完成初始化, 最后, 放入一级缓存中
而现在又回到A的getBean()过程, A得到了B的完成品, 就可以完成A的初始化, 最后放入一级缓存中,将二级缓存的引用销毁
这样就解决了前面的循环依赖的问题

但是不能解决循环依赖出现代理问题

  1. 如果代理A,依赖代理B, 代理B也依赖代理A这时就会出现代理类的循环依赖问题
    按照之前的步骤
    问题就在于第5步获取到的是A的半成品对象,而不是代理对象,这时就会出现错误

在这里插入图片描述

三级缓存, 解决循环依赖出现代理问题

在这里插入图片描述
解决的思路 : 通过工厂方法去判断是否需要提前创建代理对象,
如果是, 就用工厂方法提前创建好代理对象放到ealySingletonObjects中然后获取的就不是半成品对象了, 就是代理对象

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

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

相关文章

2023年二月份图形化一级打卡试题

活动时间 从2023年 2月1日至1月21日,每天一道编程题。 本次打卡的规则如下: (1)小朋友每天利用10~15分钟做一道编程题,遇到问题就来群内讨论,我来给大家答疑。 (2)小朋友做完题目后&…

SharedWorker 让你多个页面相互通信

SharedWorker 是一个新的Web Worker API,它允许你在多个页面之间共享一个Worker。 SharedWorker 代表一种特定类型的Worker,可以在多个浏览器上下文中运行,比如多个页面或者多个iframe。 什么是 SharedWorker 根据前几篇的了解&#xff0c…

i.MX8MM开发板音视频开发-音频编码

我们举个例子,以 CD 音质来说,量化格式是 2 字节,采样率是 44100,声道数是 2,这些信息就描述 了 CD 的音质。对于声音信息,我们还可以用数据比特率来描述音频数据单位时间内的容量大小。那么 CD 的 数 据 采…

【Java AWT 图形界面编程】Frame 窗口中进行自定义布局 ( AWT 中常用的布局容器 )

文章目录一、Frame 窗口中进行自定义布局二、AWT 中常用的布局容器一、Frame 窗口中进行自定义布局 在 【Java AWT 图形界面编程】LayoutManager 布局管理器总结 ( FlowLayout 布局 | BorderLayout 布局 | BoxLayout 布局 ) 介绍了常用的布局 ; 使用布局的好处是 布局内的子组…

【服务器数据恢复】ZFS文件系统下RAIDZ的数据恢复案例

服务器数据恢复环境: ORACLE Sun ZFS Storage; 32块磁盘分为4组,每组8块硬盘,热备盘全部启用。 ZFS文件系统,Windows操作系统。 服务器故障&分析: 设备在正常工作时候突然崩溃,经过检查排除…

机器学习笔记之深度玻尔兹曼机(三)预训练思路整理

机器学习笔记之深度玻尔兹曼机——预训练思路整理引言回顾:受限玻尔兹曼机的叠加逻辑回顾:受限玻尔兹曼机叠加过程中的计算方式关于计算过程的优化引言 上一节介绍了受限玻尔兹曼机叠加的逻辑,以及叠加过程中出现的Double Counting\text{Dou…

理解 TypeScript 背后的结构化类型系统

前言 你能说清楚类型、类型系统、类型检查这三个的区别吗?在理解TypeScript的结构化类型系统之前,我们首先要搞清楚这三个概念和它们之间的关系 类型:即对变量的访问限制与赋值限制。如 TypeScript 中的原始类型、对象类型、函数类型和字面…

python代码实现批量yunfile文件下载

建议下载文件大小不要超过1M吧,超过的话,把等待下载时间加大点 —>说明: 使用python2.7+selenium+chrome v49+百度ocr识别,基本上pip install 相关的程序,源码就可以直接运行了,exe文件也编译了,去别的电脑运行感觉有各种问题,大家自己用源码跑吧,最新chrome版本的…

如何实现报表集成?(一)

报表需求在每个企业都是“刚需”,而报表的应用又是其中的关键之一,并不是说报表开发出来就万事大吉了,怎么用、怎么用得好,也是用户非常关注的。在这个话题中,报表的集成是个绕不过去的坎,如何通过集成&…

机器学习之参数学习

下述内容为课程小结 定义 参数估计的方法包括经验风险最小化、结构风险最小化、最大似然估计、最大后验估计。 参数估计用于学习模型参数,以达到最优的目的,如线性回归的模型参数 经验风险最小化 对于输入的待处理数据格式为(x,y){(x&…

Plant Simulation热力图工具V2.1全新发布

在做AGV路径规划或人员路径规划时,如果配套热力图,是可以非常方便的分析出相应位置的热点情况,决策人员可以更加方便的确定方案修改思路,比如下图可以非常清晰地看到AGV的停顿位置和路口的使用情况。较早之前,波哥开发…

Vue3+Vite+Element-Plus实现CRUD常见表单项目

效果有 查询,增加,表格,删除,编辑 其实CRUD,就是一个管理项目最常见的功能 C增加 (Create) R读取 (Read) U更新 (Update) D删除 (Delete) 一、创建项目 vue3用vite创建项目 1 对应路径cmd 输入 npm create vitelates…

C 语言零基础入门教程(十八)

C 输入 & 输出 当我们提到输入时,这意味着要向程序填充一些数据。输入可以是以文件的形式或从命令行中进行。C 语言提供了一系列内置的函数来读取给定的输入,并根据需要填充到程序中。 当我们提到输出时,这意味着要在屏幕上、打印机上或…

SSM框架整合(Spring+SpringMVC+MyBatis)

一、创建MAVEN工程 二、导入pom依赖 <dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.2</version></dependency><!-- https://mvnrepository.com/artifact/commons-logging/comm…

项目错误排查

项目运行不起来&#xff0c;先观察表现&#xff0c;就像中医所讲的望。复现&#xff0c;了解触发问题的时机和过程。在哪个步骤&#xff0c;哪个接口出了问题。闻问切浏览器f12&#xff0c;根据请求参数和响应码判断问题出在前端还是后端。查看错误日志&#xff0c;一般写的还是…

LeetCode011之盛最多水的容器(相关话题:双指针,逻辑分析)

题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…

小程序 --- 收货地址 --- 定位功能

一、整体功能如下图二、功能点定位选择自己的位置手动选择省市县后输入详细地址关键词搜索地址&#xff0c;然后进行选择三、如何实现定位采用小程序API wx.chooseLocation 调出地图选择位置 API wx.chooseLocation 详细说明根据地址解析出省市县以及详细地址及经纬度代码实现c…

【Linux】-- 进程概念

目录 一、进程概念 二、PCB 1.什么是PCB 2.什么是task_struct 3.task_struct包含内容 三、task_struct内容详解 1.查看进程 &#xff08;1&#xff09;通过系统目录查看 &#xff08;2&#xff09;通过ps命令查看 &#xff08;3&#xff09;通过top命令查看 &…

Mysql自定义变量在递归遍历中的妙用

借着在解决一个递归查询父目录的问题&#xff0c;学习了一下mysql变量的用法&#xff0c;在某些场景下这种解法还是比较有特效的&#xff0c;下面具体来聊一下场景&#xff0c;同时也会详细分析下mysql自定义变量的用法 场景&#xff1a; 获取从树的根节点到叶子节点的全路径&…

图解基于UDS的Flash BootLoader

图解基于UDS的Flash BootLoader一、为什么要搞Bootloader&#xff1f;为什么要基于UDS搞Bootloader二、Bootloader应支持的UDS服务三、Bootloader——三段式(1) 预编程阶段(2) 主编程阶段(3)后编程状态四、BootLoader的启动顺序与转换流程五、问题点疑问点 Q:图中的烧写顺序是…