Spring循环依赖与三级缓存

Spring循环依赖是指两个或多个Bean相互依赖,导致Spring无法在不部分实例化这些Bean的情况下完成它们的创建。在Spring框架中,为了解决循环依赖问题,Spring使用了三级缓存机制。

在这里插入图片描述

假设BeanA依赖BeanB,BeanB依赖BeanA,Spring循环依赖调用流程如下:

  1. 初始化BeanA:
    • 检查一级缓存(singletonObjects),发现没有BeanA。
    • 检查二级缓存(earlySingletonObjects),发现没有BeanA。
    • 检查三级缓存(singletonFactories),发现没有BeanA。
    • 开始创建BeanA的实例。
  2. 创建BeanA过程中发现需要BeanB:
    • 将BeanA的创建流程放入三级缓存(singletonFactories)。
  3. 初始化BeanB:
    • 检查一级缓存(singletonObjects),发现没有BeanB。
    • 检查二级缓存(earlySingletonObjects),发现没有BeanB。
    • 检查三级缓存(singletonFactories),发现没有BeanB。
    • 开始创建BeanB的实例。
  4. 创建BeanB过程中发现需要BeanA:
    • 检查一级缓存(singletonObjects),发现没有BeanA。
    • 检查二级缓存(earlySingletonObjects),发现没有BeanA。
    • 检查三级缓存(singletonFactories),发现有BeanA。
    • 从三级缓存中获取BeanA的创建流程,将BeanA提前暴露到二级缓存(earlySingletonObjects)。
  5. 继续初始化BeanB:
    • 继续BeanB的初始化,完成依赖注入。
    • 将完全初始化好的BeanB放入一级缓存(singletonObjects),并从三级缓存中移除BeanB的工厂对象。
  6. 完成初始化BeanA:
    • 从二级缓存中获取提前暴露的BeanA,并完成依赖注入。
    • 将完全初始化好的BeanA放入一级缓存(singletonObjects),并从二级缓存中移除BeanA的部分实例。

简单来说,首先检查一级、二级和三级缓存中是否有BeanA,如果没有,开始创建BeanA。因为BeanA依赖BeanB,在创建BeanA时将其创建流程放入三级缓存。检查一级、二级和三级缓存中是否有BeanB,如果没有,开始创建BeanB。又因为BeanB依赖BeanA,此时三级缓存中有BeanA,从三级缓存中获取BeanA,然后将BeanA提前暴露到二级缓存。继续初始化BeanB,完成后将BeanB放入一级缓存,并从三级缓存中移除。接着从二级缓存中获取提前暴露的BeanA,完成依赖注入。将完全初始化好的BeanA放入一级缓存,并从二级缓存中移除。

在Spring Boot 2.6.0之前,Spring可以通过其三级缓存机制自动解决循环依赖的问题。但从2.6.0开始,如果存在循环依赖问题,Spring会抛出异常。在Spring Boot 2.6.0及之后的版本中,默认情况下,Spring不再自动解决循环依赖。如果在应用中遇到循环依赖问题,可以通过以下方法解决:

  • 重新设计Bean的依赖关系:这是最推荐的方式。通过重新设计Bean的依赖关系,消除循环依赖,从根本上解决问题。
  • 使用@Lazy注解:将其中一个Bean的依赖注入设置为懒加载,延迟依赖注入,从而打破循环依赖。
  • 设置allow-circular-references属性:如果确实需要循环依赖,可以在配置文件中设置allow-circular-references属性为true,允许Spring处理循环依赖。

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

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

相关文章

Nginx详解(超级详细)

目录 Nginx简介 1. 为什么使用Nginx 2. 安装Nginx Nginx的核心功能 1. Nginx反向代理功能 2. Nginx的负载均衡 3 Nginx动静分离 Nginx简介 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协…

2-35 基于matlab的四足液压机器人设计程序

基于matlab的四足液压机器人设计程序,界面化例程,输入液压机器人结构参数,输出液压缸的行程、推力和速度。程序已调通,可直接运行。 2-35 四足液压机器人 液压机器人结构参数 - 小红书 (xiaohongshu.com)

Postman、Apifox、Apipost用哪个?

Postman、Apifox、Apipost都是流行的API接口管理工具,它们各自具有不同的特点和优势,因此哪个更好用取决于具体的使用场景和需求。以下是对这三个工具的比较分析: 一、Postman 特点与优势: 支持多种请求方式:包括GE…

基于Python+Django+MySQL的心理咨询预约系统

心理咨询预约系统 DjangoMySQL 基于PythonDjangoMySQL的心理咨询预约系统 项目主要依赖Django3.2,MySQL 支持随机验证码生成与登录验证 简介 基于PythonDjangoMySQL的心理咨询预约系统通过连接数据库获取数据,登录新增随机数字验证码验证。具体可以看…

VisualRules-Web案例展示(一)

VisualRules单机版以其卓越的功能深受用户喜爱。现在,我们进一步推出了VisualRules-Web在线版本,让您无需安装任何软件,即可在任何浏览器中轻松体验VisualRules的强大功能。无论是数据分析、规则管理还是自动化决策,VisualRules-W…

GESP CCF C++ 四级认证真题 2024年6月

第 1 题 下列代码中,输出结果是( ) A. 12 24 24 12 B. 24 12 12 24 C. 12 12 24 24 D. 24 24 12 12 第 2 题 下面函数不能正常执行的是() A. B. C. D. 第 3 题 下面程序…

理解UI设计:UI设计师的未来发展机遇

UI设计师的出现是互联网时代的设计变革。随着移动互联网的快速发展,移动产品设计师非常短缺。高薪资让许多其他行业的设计师已经转向了UI设计。那么什么是UI设计呢?UI设计师负责什么?UI设计的发展趋势和就业前景如何?这些都是许多…

JMX 反序列化漏洞

前言 前段时间看到普元 EOS Platform 爆了这个洞,Apache James,Kafka-UI 都爆了这几个洞,所以决定系统来学习一下这个漏洞点。 JMX 基础 JMX 前置知识 JMX(Java Management Extensions,即 Java 管理扩展&#xff0…

PyTorch 深度学习实践-加载数据集

视频指路 参考博客笔记 参考笔记二 目录标题 介绍课程代码作业实现 介绍 在深度学习时用min-batch来平衡训练时间和性能上的需求,之后训练周期要写成两层嵌套循环。epoch:所有训练样本进行完一次前向和反向传播,batch-size:训练的…

Yolo-World网络模型结构及原理分析(更新中)

文章目录 概要一、整体架构分析二、详细结构分析1.YOLO检测器1.1 Backbone1.2 Head1.3 各模块的过程和作用Conv卷积模块C2F模块BottleNeck模块SPPF模块Upsampling模块Concat模块 2.文本编码器 Text Encoder 概要 尽管YOLO(You Only Look Once)系列的对象…

AI(Adobe lliustrator)教程+软件包

简介: 软件主要应用于印刷出版、海报书籍排版、专业插画、多媒体图像处理和互联网页面的制作等,也可以为线稿提供较高的精度和控制,适合生产任何小型设计到大型的复杂项目。 通常用于创建LOGO(商标或徽标),图标,插图…

实践之K近邻算法实现红酒聚类

前言 K近邻算法是一种用于分类和回归的非参数统计方法,通过计算样本与训练样本的距离,找出最接近的k个样本进行投票来确定分类结果。算法的基本要素包括K值、距离度量和分类决策规则。 K值决定了邻居的影响程度,距离度量反映了样本间的相似度…

基于Java的汽车租赁管理系统设计(含文档、源码)

本篇文章论述的是基于Java的汽车租赁管理系统设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。 目录 摘 要 系统运行截图 系统总体设计 系统论文 资源下载 摘 要 近年来,随着改革开放…

旋转编码器 - 从零开始认识各种传感器【第八期】

旋转编码器|从零开始认识各种传感器 1. 什么是旋转编码器? 旋转编码器是一种能够将旋转位置变化转换为数字信号输出的装置,被广泛应用于机械设备、自动化控制、测量仪表等领域。它是电位计的现代数字等效产品,比电位计功能更广泛。 电位计只…

数据结构——堆,堆排序

前提 我们都知道内存分布中的堆区(Heap section),new出来的空间都在堆区上。和堆区有一个名字很相近的数据结构——堆(Heap),虽然名称相近,但两者是完全不同的东西。 因为十大排序算法中有一个堆排序,所以从头开始了解下堆这个数…

JAVASE-医疗管理系统项目总结

文章目录 项目功能架构运行截图数据库设计设计模式应用单列设计模式JDBC模板模板设计模式策略模式工厂设计模式事务控制代理模式注解开发优化工厂模式 页面跳转ThreadLocal分页查询实现统计模块聊天 项目功能架构 传统的MVC架构,JavaFX桌面端项目,前端用…

Linux如何正确安装MySQL数据库

对于Linux安装mysql,如果大家有不会的可以来参考小编的详细安装步骤哦,小编带你一步步走向成功~ 首先对于Linux系统,我们通过小编的上一篇文章中知道安装软件的命令为wget,所以首先需要写出命令获取mysql: wget https://cdn.mys…

高频面试题-CSS

BFC 介绍下BFC (块级格式化上下文) 1>什么是BFC BFC即块级格式化上下文,是CSS可视化渲染的一部分, 它是一块独立的渲染区域,只有属于同一个BFC的元素才会互相影响,且不会影响其它外部元素。 2>如何创建BFC 根元素,即HTM…

【Git远程操作】向远程仓库推送 | 拉取远程仓库

目录 1.向远程仓库推送 ​1.1本地仓库的配置 1.2remote-gitcode本地仓库 1.3推送至远程仓库 2.拉取远程仓库 现阶段以下操作仅在master主分支上。 1.向远程仓库推送 工作区☞add☞暂存区☞commit☞本地仓库☞推送push☞远程仓库注意:本地仓库的某个分支 ☞推…

趣谈linux操作系统 9 网络系统-读书笔记

文章目录 网络协议栈基础知识回顾网络分层网络分层的目的各层作用简介延伸-ip地址,有类,无类,cidr socket实现分析tcp/udp回顾socket编程回顾TCP编程回顾UDP编程回顾差异 socket相关接口实现浅析sokcet实现解析创建socket的三个参数socket函数定义及其参数创建socket结构体关联…