当前位置: 首页 > news >正文

什么是循环依赖,spring是如何去解决循环依赖问题的?什么是三级缓存?【spring】

文章目录

    • 什么是循环依赖?
    • 什么是三级缓存?
    • 执行流程

什么是循环依赖?

在我们的开发中,会不可避免的遇到Bean之间循环依赖的,所谓循环依赖,就是两个或者两个以上的Bean互相持有对方,这样在程序运行调用中,会出现这种循环依赖的现象,其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。

举个简单的例子,两个Bean的循环依赖:

@Service
public class Demo1 {@Autowiredprivate Demo2 demo2;public void test1() {}
}@Service
public class Demo2{@Autowiredprivate Demo1 demo1;public void test2() {}
}

这个就是循环依赖。
在这里插入图片描述
依赖分为三种:

  • 自己依赖自己
  • 两个对象相互依赖
  • 多个对象相互依赖

什么是三级缓存?

singletonObjec:用于存放完全初始化好的 bean,从该缓存中取出的 bean 可以直接使用
earlySingletonObjects:提前曝光的单例对象的cache,存放原始的 bean 对象(尚未填充属性),用于解决循环依赖
singletonFactories:单例对象工厂的cache,存放 bean 工厂对象,用于解决循环依赖

看下面代码前建议先了解Bean的创建流程:https://blog.csdn.net/wang121213145/article/details/124748726

详细代码
在spring中的DefaultSingletonBeanRegistrygetSingleton()方法
在这里插入图片描述

执行流程

在这里插入图片描述

  • 第一层,先去获取 A 的 Bean,发现没有就准备去创建一个,然后将 A 的代理工厂放入“三级缓存”(这个 A 其实是一个半成品,还没有对里面的属性进行注入),但是 A 依赖 B 的创建,就必须先去创建 B;
  • 第二层,准备创建 B,发现 B 又依赖 A,需要先去创建 A;
  • 第三层,去创建 A,因为第一层已经创建了 A 的代理工厂,直接从“三级缓存”中拿到 A 的代理工厂,获取 A 的代理对象,放入“二级缓存”,并清除“三级缓存”;
  • 回到第二层,现在有了 A 的代理对象,对 A 的依赖完美解决(这里的 A 仍然是个半成品),B 初始化成功,并将B放入一级缓存
  • 回到第一层,现在 B 初始化成功,完成 A 对象的属性注入,然后再填充 A 的其它属性,以及 A 的其它步骤(包括 AOP),完成对 A 完整的初始化功能(这里的 A 才是完整的 Bean),将 A 放入“一级缓存”。

如果没有采用三级缓存的话,会出现循环依赖,所以加入的第三级缓存,便于从对象工厂拿到创建的对象。

相关文章:

什么是循环依赖,spring是如何去解决循环依赖问题的?什么是三级缓存?【spring】

文章目录什么是循环依赖?什么是三级缓存?执行流程什么是循环依赖? 在我们的开发中,会不可避免的遇到Bean之间循环依赖的,所谓循环依赖,就是两个或者两个以上的Bean互相持有对方,这样在程序运行…...

Cron表达式

网上搜一下就有在线生成网站,很方便。 比如:Cron表达式生成器 用途 定时调度任务,比如说服务器、云函数中定时执行脚本函数。 Cron 表达式构成 Cron 表达式是字符串,一般由 6 - 7 个字段构成,空格分隔。每个字段代…...

JavaScript 作用域

作用域是可访问变量的集合。在JavaScript中,能够定义全局作用域或者局部作用域。在 JavaScript 中, 对象和函数同样也是变量。在 JavaScript 中, 作用域为可访问变量,对象,函数的集合。JavaScript 函数作用域: 作用域在函数内修改。JavaScrip…...

Hive内部表与外部表的区别具体说明

目录 1.在/opt/atguigu/目录下,新建两个txt文件 2.在hadoop的web端递归创建一个目录,存储这两个文件 3.查看web端的文件 一、内部表: 1.创建一个内部表,并指定内部表的存储位置 2.查看内部表,内部表中没有数据 …...

Java流程控制

目录 前言 一、用户交互Scanner及其进阶使用 输入的数据为字符串类型 输入的数据为整型或者浮点型 练习 二、顺序结构 三、选择结构 if单选泽结构 if双选择结构 if多选择结构 嵌套的if结构 switch多选择结构 四、循环结构 while循环 Do...while循环 For循环 练习 利用for循环…...

I.MX6ULL_Linux_系统篇(17) uboot分析-启动linux

bootz 启动 Linux 内核 images 全局变量 不管是 bootz 还是 bootm 命令,在启动 Linux 内核的时候都会用到一个重要的全局变量:images, images 在文件 cmd/bootm.c 中有如下定义: images 是 bootm_headers_t 类型的全局变量&…...

C/C++每日一练(20230221)

目录 1. 格雷编码 2. 矩阵问题 3. 搜索旋转排序数组 II 1. 格雷编码 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案&#…...

用Python采集热门城市景点数据并简单制作数据可视化图

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 模块使用: 爬虫部分: requests parsel csv 数据分析部分: pandas pyecharts 如何安装模块: win R 输入 cmd 输入安装命令: pip install 模块名 回车 pycharm里面安装 terminal 输入安装命令…...

论文阅读:pixelNeRF: Neural Radiance Fields from One or Few Images

中文标题:从一或少量图像中构建神经辐射场 提出问题 NeRF效果虽然惊艳,但是其需要大量环绕图像以及长时间的训练。 创新点 与原始的NeRF网络不使用任何图像特征不同,pixelNeRF将与每个像素对齐的空间图像特征作为输入。也可以集合更多输入…...

C++项目——高并发内存池(1)--介绍及定长内存池

1.什么是内存池 1.1 池化技术 将程序中需要经常使用的核心资源先申请出来,放在一个池内,由程序自己管理,这样可以提高资源的使用效率,也可以保证本程序占有的资源数量。 比如之前博文实现的线程池,就是预先的申请出…...

网络有线无线配置

一、需求 在无线接入区内,当Lsw1的上联口出现故障时,需要通过AP1-LSw1-LSw2-LSw3的路径访问公网server3。这是因为AP1通过无线网连接到LSw1,而LSw1与LSw3之间的链路出现故障,无法直接访问公网server3。因此,流量需要通…...

阅读笔记——Feature-Point Matching for Aerial and Ground Images方法

阅读笔记——Feature-Point Matching for Aerial and Ground Images 1.应用背景 在三维重建应用中,常用的是航空影像,但在城市环境中,面对大量的高层建筑物,航空影像往往不能很好的重建出完整的三维模型。因为航空影像视角约束以…...

前端工程师面试题10条必会笔试题

布局 左边20% 中间自适应 右边200px 不能用定位答案:圣杯布局/双飞翼布局或者flex什么叫优雅降级和渐进增强?渐进增强 progressive enhancement:针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进…...

【技术分享】Web自动化之Selenium安装

Web 应用程序的验收测试常常涉及一些手工任务,例如打开一个浏览器,并执行一个测试用例中所描述的操作。但是手工执行的任务容易出现人为的错误,也比较费时间。因此,将这些任务自动化,就可以消除人为因素。Selenium 可以…...

【Linux】进程状态的理解

✍作者:阿润菜菜 📖专栏:Liunx系统编程 本文目录概述两个先行概念我们为啥创建进程Linux下的进程状态1. R 运行状态2.S 休眠状态 --- 可中断休眠状态3. D 磁盘休眠状态 ---不可中断休眠4.T 暂停状态 (t 追踪暂停状态)5…...

打游戏哪种蓝牙耳机比较好?适合玩游戏的无线蓝牙耳机

2023年耳机市场一如既往地卷,不只是卷音质,还在外观和功能上做了许多的改进,以至于现在哪怕不懂耳机的人从各电商平台都能闭眼入一个款平价品牌耳机且极少会踩雷,玩游戏是当前年轻人的娱乐方式,下面整理了几款适合玩游…...

Fortinet推出新一代自研安全芯片,跨所有网络边缘加速网络与安全融合

专注网络与安全融合的全球网络安全领导者 Fortinet(NASDAQ:FTNT),近日宣布推出新一代自研安全芯片 FortiSP5,作为 Fortinet ASIC 技术的最新突破,有力推动了分布式网络边缘安全的重大飞跃。FortiSP5 源自 F…...

ChatGPT爆火背后的真相:学编程已经成为必选项

这一阵最热门的话题,莫过于人工智能新选手——ChatGPT,在推出后只用了两个月就积累了1亿用户!它的出现在科技圈掀起了一阵“惊涛骇浪”,有人称ChatGPT的意义,堪比当年蒸汽机的出现,它足以爆发新一轮的“工业…...

Unity UI框架

一、简介 最近在各大网站看了一下 Unity3d 的 UI 框架,各种 UI 框架已经有很多的版本了,各有千秋,有的功能虽然写的完善,但用起来太复杂,有的框架功能不完善,搞个课程就上架了,还有什么 MVC 框…...

vue2提取vue-router的title单独存放,使用i18n实现

成品效果 首先引入i18n(vue-i18n官网文档) 依赖包 npm install vue-i18n8然后单独在src目录下新建一个文件夹lang,存放相对应的变量名称,我这里只做显示中文所以其他引入我都注释了,具体目录如下: src\lang/zh.js部分代码 export…...

探索GetQzonehistory:永久保存QQ空间记忆的数字时光机

探索GetQzonehistory:永久保存QQ空间记忆的数字时光机 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字时代,我们的记忆分散在各个社交平台,而Q…...

GT New Horizons材质包精选:10款提升沉浸体验的视觉升级方案

GT New Horizons材质包精选:10款提升沉浸体验的视觉升级方案 【免费下载链接】GT-New-Horizons-Modpack A big progressive questing modpack for Minecraft 1.7.10 balanced around the mod GregTech. 项目地址: https://gitcode.com/GitHub_Trending/gt/GT-New-…...

数据库存储有什么作用

数据库存储就是把数据安全、规范、高效地存起来,方便以后用,核心作用可以分成这几块:1. 持久化保存程序关掉、电脑重启,数据不会丢失不像内存一断电就清空,数据库存在硬盘里长期保存2. 统一管理数据把零散的文件、记录…...

从CVE-2025-65112到NPM投毒:手把手教你搭建安全的私有包仓库(以PubNet为例)

从CVE-2025-65112到NPM投毒:手把手教你搭建安全的私有包仓库(以PubNet为例) 最近几年,软件供应链攻击事件频发,从SolarWinds事件到Log4j漏洞,再到最近的NPM投毒事件,每一次都让开发者们心惊胆战…...

Qwen3-14B部署后效果追踪:30天使用数据与关键指标增长分析

Qwen3-14B部署后效果追踪:30天使用数据与关键指标增长分析 1. 部署效果概览 在RTX 4090D 24GB显存环境下部署Qwen3-14B镜像后,我们对系统进行了为期30天的持续监测。数据显示,这套优化配置展现出令人印象深刻的稳定性和性能表现&#xff1a…...

OpenClaw API配置失败?3步快速修复,免费额度高效利用

OpenClaw API配置失败?3步快速修复,免费额度高效利用引言 OpenClaw作为新一代数据采集平台,其API凭借高效稳定的特性已成为开发者首选的工具之一。但在实际接入过程中,配置失败问题频发,尤其对免费额度用户造成严重困扰…...

【实战】CodeBuddy使用技巧:5个Skills让编程效率翻倍的隐藏操作

目录摘要一、CodeBuddy不只是代码补全1.1 三种形态,覆盖全开发场景1.2 核心差异化二、Craft模式:一句话从0到上线2.1 实测案例:20分钟出一个完整MVP2.2 多模型切换策略2.3 Figma设计稿一键转代码三、5个效率翻倍的独有技巧3.1 技巧1&#xff…...

Mermaid Live Editor:3分钟学会专业图表制作的终极免费工具

Mermaid Live Editor:3分钟学会专业图表制作的终极免费工具 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-e…...

Wireshark抓包实战:用一道CTF题彻底搞懂IP分片与UDP重组

Wireshark抓包实战:用一道CTF题彻底搞懂IP分片与UDP重组 在网络安全竞赛中,一个看似简单的UDP传输任务可能隐藏着协议层面的精妙设计。去年CyBRICS赛事中的lx100题目就完美诠释了这一点——参赛者需要从相机传输的UDP流量中提取图片,而真正的…...

Python通达信数据接口实战指南:开源量化工具配置与优化全解析

Python通达信数据接口实战指南:开源量化工具配置与优化全解析 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx MOOTDX是一个高效实用的Python通达信数据接口库,为量化投资和…...