如何解决spring的循环依赖问题?

news2024/12/23 22:06:38

前言

昨天我们说了什么是spring的循环依赖,以及产生的原因,今天那我们就来说说如何解决spring的循环依赖问题。 上篇文章说到过,只有通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题是被解决的?

Spring是怎样解决单例模式下循环依赖的呢?

其实主要的就是靠提前暴露创建中的单例实例。

单例模式下的Setter赋值的循环依赖

如图的例子,A依赖B,B依赖C,C又依赖B。
其过程过程如下:

  1. 创建A,调用构造方法并完成构造,进行属性赋值注入,发现了依赖B,去实例化B。
  2. 创建B,调用构造方法并完成构造,进行属性赋值注入,发现了依赖C,去实例化C。
  3. 创建C,调用构造方法并完成构造,进行属性赋值注入,发现依赖A。

    此时就是解决循环依赖的关键,因为A已经通过构造方法已经构造完成了,也就是说已经将Bean在堆中分配好了内存,这样即使A再填充属性值其也不会在改变它的内存地址了,所以此时就可以提前拿出来A的引用,来完成对C的实例化。

所以通过使用这种方法,对c的创建过程就变成: 4. 创建C,调用构造方法,完成构造并进行属性赋值注入,发现了依赖A,A也已经构造完成,直接引用,完成C的实例化。 5. C完成实例化后,注入B,B也完成了实例化,然后B注入A,A也完成了实例化。
为了能获取到创建中单例bean,spring就提供了三级缓存来将正在创建中的bean提前暴露,从而解决单例模式下的Setter赋值的循环依赖问题。 过程如图所示:

Spring三大缓存:

Spring中有三个缓存,缓存的作用是用来存储单例的Bean实例;这三个缓存是彼此互斥的,不会针对同一个Bean的实例同时进行存储。

如果调用getBean,则需要从三个缓存中按顺序依次进行获取指定的Bean实例。其读取顺序依次是:

一级缓存-->二级缓存-->三级缓存

  • 一级缓存,singletonObjects 单例缓存,存储已经实例化的单例bean(已经创建完毕)。
  • 二级缓存,earlySingletonObjects 提前暴露的单例缓存,其存储的bean是刚刚构造完成,但后面还会通过属性注入bean(Bean被提前暴露的引用,但是Bean还在创建中)。
  • 三级缓存,singletonFactories 生产单例的工厂缓存,存储工厂(正在创建中)。

总结

通过spring的三个缓存方式来解决单例模式下循环依赖的问题,而其他的场景下产生的依赖问题是解决不了的,会报错。

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

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

相关文章

rhce第二次作业

配置ssh免密登陆,能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接 [root456 ~]# hostname host [root456 ~]# bash \\更改名称[roothost ~]# su redhat …

2023年腾讯云S5云服务器性能网络收发包PPS、连接数、内网带宽能力等性能测评

腾讯云服务器标准型S5实例CPU采用Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器,主频2.5GHz,睿频3.1GHz,标准型S5云服务器基于全新优化虚拟化平台,配有全新的Intel Advanced Vector Extension (AVX-512) 指令集&#…

微服务+springcloud+springcloud alibaba学习笔记【Spring Cloud服务网关】(7/9)

Spring Cloud服务网关 7/91、GateWay概述2、GateWay的特性:3、GateWay与zuul的区别:4、zuul1.x的模型:5、什么是webflux:6、GateWay三大概念:6.1,路由:6.2,断言:6.3,过滤:7、GateWay的工作原理:8、使用GateWay:8.1,建module8.2,修改pom文件8.3,写配置文件8.4,主启动类8.5,针对p…

Springboot 整合 Redis 进行基本操作

SpringBoot整合Redis 首先创建 Springboot 项目。 spring-data-redis针对jedis提供了如下功能:1.连接池自动管理,并提供了一个高度封装的“RedisTemplate”类2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口ValueOperat…

计网第六章.应用层各协议概览

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 目录一. C/S方式和P2P对等方式二. 动态主机配置协议DHCP三.域名系统DNS域名解析过程四.文件传输协议FTP基本工作原理:五.电子邮件六.万维网www万维网的文档6.1 HTTP(HyperText Transfer Protocol&am…

左手Python 右手R —— 最大公约数和最小公倍数

左手Python 右手R —— 最大公约数和最小公倍数前言1、 最大公约数1.1 约数1.2 最大公约数1.3 求解方法2、 最小公倍数2.1 倍数2.2 最小公倍数2.3 求解方法3、程序实现3.1 python 代码实现3.2 R语言代码实现小结创作不易,都浏览到这儿了,看官可否将下面的…

【Linux系统创建,修改用户和组和修改目录文件的权限以及实验的心得体会】

实验过程 1.创建一个新用户nick,设置其主目录为home/nick。 (1)添加新用户: sudo useradd -m 用户名 sudo passwd 新用户名 (2)给新用户可以执行的root权限 sudo vi /etc/sudoers #User privilege specification roo…

Spring Security实战(一)——基于内存和数据库模型的认证与授权

目录 简介 一、初识Spring Security(入门案例) (1)新建project (2)选择依赖 (3)编写一个 HelloController (4)启动项目,访问localhost:8080…

手动清除gitlab中prometheus的数据

背景: gitlab服务器上, 磁盘经常爆满。后来通过 du -sh ./* 查出prometheus下的data占了绝大多数磁盘空间。 因此,准备删除prometheus的数据。 思路 由于prometheus的数据占用的空间较大,因此在实际使用时,可以关闭…

【 Spring MVC 核心功能(一) - 使用注解实现 URL 路由映射】

文章目录引言一、RequestMapping 注解介绍1.1 RequestMapping 是 post 还是 get 请求?1.2 RequestMapping 指定一种请求方式二、GetMapping三、PostMapping四、总结引言 前面我们讲到,学习 Spring MVC 需要掌握三个核心功能即连接,获取参数&…

avi文件怎么转成mp4视频,3种方法快速学

avi文件怎么转成mp4视频?前面小编给大家讲了mov格式和webm格式,以及如何将mov和webm格式转换成mp4格式。今天小编给大家说一说另外一种视频格式,就是avi,AVI英文全称为Audio Video Interleaved,即音频视频交错格式&…

SpringBoot中对Bean的处理方法以及第三方Bean处理的方式

我们可以通过Spring当中提供的注解Component以及它的三个衍生注解(Controller、Service、Repository)来声明IOC容器中的bean对象,为应用程序注入运行时所需要依赖的bean对象,也就是依赖注入DI。 关于IOC容器中Bean的其他使用细节…

矿泉水为什么会溴酸盐超标

矿泉水为什么会溴酸盐超标? 水生产企业多使用臭氧消毒,不过,水生产企业不存在水运输路途遥远的问题,因此可以使用臭氧消毒。同时,也是因为臭氧在消毒后会直接变成氧气,所以不会有使用氯消毒后的那种味道&a…

give_you_flag(GIF原理、二维码定位符)

下载附件是一个GIF 看到最后你会发现它突然漏了一个二维码出来 我们将这个GIF分解成图片(动图就是由多张静态图片组合而成,按照一定的顺序和时间播放的) https://tu.sioe.cn/gj/fenjie/ 提取出里面包含二维码的那张 但是我们发现这里有一个…

word2vec原理

1.背景 2013年,Google开源了一款用于词向量计算的工具—word2vec,引起了工业界和学术界的关注。首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练;其次,该工具得到的训练结果——词向量(word embed…

GDPU C语言 天码行空7

1. 数组最大值交换 ⭐ 1e9&#xff1a;10的9次方 #include<stdio.h>int main() {int n, i,idx 0;//idx 记录第一个出现的最大值下标scanf("%d", &n);double a[30];double max -1e9;// 1e9 表示10的9次方&#xff0c;十亿&#xff0c;int 的最大范围级别…

使用RT-Thread Studio搭配STM32CubeMX新建RT-Thread项目

STM32CubeMX下载 RT-Thread Studio下载 安装好RT-Thread Studio后&#xff0c;先打开RT-Thread SDK管理器确认有没有自己MCU需要的SDK包&#xff0c;直接安装好之后里面是有STM32F1系列的SDK包&#xff0c;其他的需要自己安装。 之后点击文件→新建→RT-Thread项目&#xff0…

C++ 实现 matlab 的 zp2tf 函数

文章目录1. matlab 的 zp2tf 函数的作用2. matlab 的 zp2tf 函数的使用方法3. C实现3.1 complex.h 文件3.2 zp2tf.h 文件4. 测试结果4.1 测试文件4.2 测试结果1. matlab 的 zp2tf 函数的作用 作用是将极点形式的 H(s) 函数的分母展开 2. matlab 的 zp2tf 函数的使用方法 [z,…

ICASSP2023 | 基于多任务学习的保留背景音的语音转换

在影视、有声书内容中&#xff0c;背景音是一种表现丰富的艺术形式。语音转换&#xff08;Voice Conversion&#xff09;如能将源说话人语音转换成目标说话人语音的同时&#xff0c;保留源语音中的背景音&#xff0c;将会提供更沉浸的语音转换体验。之前的语音转换研究主要关注…

低代码平台很赞,用2个小时,搭出1套应用

最近低代码很火&#xff0c;到处都是低代码的尝试贴&#xff0c;笔者今天也决定深入体验一下&#xff0c;感受它的便捷程度。 在案例开始之前&#xff0c;我们先来聊聊概念。 一、低代码 低代码实质上并不是一个新颖的话题&#xff0c;也不是最近才有的技术突破和创新&#xf…