Spring的循环依赖问题

news2025/1/11 14:11:00

Spring中循环依赖场景有:

  • 构造器的循环依赖(构造器注⼊)

  • Field 属性的循环依赖(set注⼊)

各场景下循环依赖解决的情况

  • 单例 bean 构造器参数循环依赖(⽆法解决)
    构造器在Bean的生命周期中实例化Bean的时候是需要载入参数的,而解决循环依赖时放入三级缓存中提前暴露出来的Bean对象时没有设置属性值的,所以这里构造器循环依赖不能处理。

  • prototype 原型 bean循环依赖(⽆法解决)
    对于原型bean的初始化过程中不论是通过构造器参数循环依赖还是通过setXxx⽅法产⽣循环依赖,Spring都会直接报错处理。

  • 单例bean通过setXxx或者@Autowired进⾏循环依赖(可以解决)
    单例bean构造器的循环依赖问题⽆法解决,只能拋出 BeanCurrentlyInCreationException 异常,在解决属性循环依赖时,spring采⽤的是提前暴露对象的⽅法。

Spring循环依赖处理流程

Spring循环依赖的理论依据是基于java的引用传递,当获得对象的引用时对象的属性是可以延后设置的,但是构造器必须在获取引用之前。Spring通过setXxx或者@Autowired方法解决循环依赖,其实是通过提前暴露出来一个ObjectFactory对象来完成的。简单来说ClassA在调用构造器完成对象初始化之后,在调用ClassA的setClassB方法之前就把ClassA实例化的对象通过ObjectFactory提前暴露在Spring容器中。

  • Spring容器初始化A对象后,将实例化后的classA对象立马放入三级缓存提前暴露在Spring容器中;
  • classA调用setClassB方法,Spring首先尝试从容器中获取ClassB,此时ClassB不存在Spring容器中;
  • Spring容器初始化ClassB,B在创建的时候发现依赖于ClassA,那么去三级缓存中查找尚未成型的ClassA,并将其放入到二级缓存。放入二级缓存的时候可以做一些扩展操作。然后将ClassA返回,将ClassA赋值给ClassB的属性。
  • 此时ClassB就装配完成,将ClassB 的对象放入一级缓存。
  • ClassA从一级缓存中获取到ClassB的对象完成装配,完成初始化操作。此时循环依赖问题得到解决。

Spring的循环依赖

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

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

相关文章

GitHub最新发布,阿里十年架构师手写版spring全家桶笔记全新开源

嗨咯,大家好! 没错,又是我,还跟前面一样,有好东西我才会出现。那是什么好东西呢?今天啊,给他分享阿里在Github最新发布的spring全家桶笔记第九版,这份笔记一共分三份:sp…

G1垃圾回收器

概述 官网 https://docs.oracle.com/en/java/javase/16/gctuning/garbage-first-g1-garbage-collector1.html#GUID-ED3AB6D3-FD9B-4447-9EDF-983ED2F7A573 简介 G1垃圾回收器可以同时回收新生代和老年代的对象,不需要两个垃圾回收器配合起来运作,他一…

高项 进度管理论文

七个过程: 项目进度管理包括为管理项目按时完成所需的7个过程,具体为: (1)规划进度管理:为规划、编制、管理、执行和控制项目进度而制定政策、程序和文档过程。 (2)定义活动&…

【C语言】初阶指针的简单使用 _指针运算 指针和数组的关系[初阶篇 _学习专用]

1.指针是什么? 在学习指针的时候,我们经常会看到下面这段代码: int main() {int a 10;int* pa &a;*pa 20; } 之前并没有接触过指针的朋友们看到后可能是一头雾水,根本不知道从哪里去理解;下面我们就通过一些…

STM32开发时HardFault错误的排查

STM32开发时HardFault错误的排查 本篇是 嵌入式开发-STM32硬件I2C驱动OLED屏 一文的扩展。 把相关的问题记录一下,给遇到HardFault_Handler问题的朋友做个参考。 故障现象 做STM32开发,经常遇到HardFault错误,也就是程序不会正常运行&…

WPF动画(2)

动画的生命周期 从技术的角度看,WPF动画只是暂时的,这意味着它们不能真正改变基本属性的 值,当动画处于活动状态时,只是覆盖了属性的值 。 单向动画,在动画运行结束后会保持处于活动状态,这是因为动画需要…

(十一)手写简单的Spring框架

文章目录第一步:搭建环境第二步:准备好要管理的Bean第三步:准备myspring.xml配置文件第四步:编写MyApplicationContext接口第五步:编写MyClassPathXmlApplicationContext第六步:采用Map集合存储Bean第七步&…

第十一章 Golang面向对象编程(下)

面向对象编程三大特性 基本介绍 Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其他OOP语言不一样。 封装 面向对象编程思想-抽象 我们在前面去定义一个结构体的时候,实际上就是把一类事物共有的属性(字段…

Presto 之 explain and explain analyze的实现

一. 前言 本文主要探索在Presto中Explain功能是如何实现的。在Presto中,Explain用法有两种,一种是单纯的explain,此场景只会显示经过RBO优化后的执行计划,但是查询并不会真正地执行。第二种是explain analyze,此场景会…

JVM常用参数

JVM内存相关的几个核心参数 -Xms:Java堆内存初始大小-Xmx:Java堆内存的最大大小-Xmn:Java堆内存中的新生代大小,扣除新生代剩下的就是老年代的内存大小了-XX:PermSize:永久代大小-XX:MaxPermSize:永久代最…

疾控物资管理系统-疾控中心物资管理系统

一、系统概述 东识科技(DONWIT)疾控中心物资管理系统(智物资DW-S300)是依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 随着疫情的突…

(STM32)从零开始的RT-Thread之旅--GPIO

上一篇: (STM32)从零开始的RT-Thread之旅--基础项目构建与时钟配置 无论什么开发板,最先调试的肯定是GPIO,一般用来用作指示灯或者按键输入。本篇只是很简单的GPIO应用,没有具体分析RTT框架实现。 首先先创建一个BSP文件夹&…

机器人操作系统ROS(21) jetson nano安装torch tensorflow

安装torch、tensorflow其实跟普通在Linux系统安装没有区别,但是Linux是arch64位的,而jetson是aarch64位的,所以还是不太一样。 另外一个坑是:购买的创乐博的机器人,已经安装ros,但是安装torh的时候需要apt …

使用Spring实现工厂+策略模式

使用Spring实现工厂策略模式 这里使用发短信业务&#xff1a; 不同短信有不同模板但是发送方法都相同只是发送内同不同 1. 定义短信发送策略接口&#xff1a; //策略接口 public interface SmsTemStrategy {public void sendSms(Map<String,String> params); }2.短信…

【Python】Numpy傅里叶变换总结

文章目录简介fft简介 Fourier变换极其逆变换在数学上的定义如下 F(ω)∫−∞∞f(t)e−iωtdtf(t)π2∫−∞∞F(ω)eiωtdωF(\omega)\int^\infty_{-\infty}f(t)e^{-i\omega t}\text dt\\ f(t)\frac{\pi}{2}\int^\infty_{-\infty}F(\omega)e^{i\omega t}\text d\omega F(ω)∫−…

飞行机器人专栏(八)-- AGX Xavier 通信、控制及视觉应用开发

目录 0. Introduction of Jetson Developer kits 1. 硬件对比 Jetson 模组系列 Jetson AGX Orin 系列 Jetson Orin NX 系列 Jetson AGX Xavier 系列 Jetson Xavier NX 系列 Jetson TX2 系列 Jetson Nano 2. 应用场景 1. Introduction of AGX Xavier Taking Perform…

HTML+PHP+MySQL实现新闻列表模块(1+X Web前端开发中级 例题)——初稿

&#x1f4c4;题目要求 阅读下列说明、效果图、MySQL数据库操作和代码&#xff0c;进行动态网页开发&#xff0c;填写&#xff08;1&#xff09;至&#xff08;15&#xff09;代码。&#x1f9e9;说明 该程序为一个html和php混合的新闻列表模块&#xff0c;使用PHP语言&#x…

【深入浅出Spring6】第九期——Spring对事务的支持

因为很多系统都包含事务&#xff0c;所以Spring提供了相关的Api&#xff0c;属于AOP切面编程的二次封装 那么什么是事务&#xff08;Transaction&#xff09;呢&#xff1f; 指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)在一个业务流程中可能需要多条DML联合执…

【Hack The Box】Linux练习-- OpenAdmin

HTB 学习笔记 【Hack The Box】Linux练习-- OpenAdmin &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月22日&#x1f334; &#x…

Flutter组件--OverflowBox、SizedOverflowBox(子组件超出父组件裁剪)

1.OverflowBox介绍 OverflowBox 允许子控件超出父控件的边界。这个特性主要可以用来实现文字或者按钮角标的. OverflowBox构造函数 const OverflowBox({Key? key,this.alignment Alignment.center,this.minWidth,this.maxWidth,this.minHeight,this.maxHeight,Widget? ch…