您当前的位置:首页 > 电脑百科 > 电脑知识

SpringIOC循环依赖问题

时间:2023-05-04 13:40:31  来源:今日头条  作者:日拱一卒程序猿

一、什么是循环依赖

循环依赖其实就是循环引用,也就是两个或者两个以上的 Bean 互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。

注意,这里不是函数的循环调用,是对象的相互依赖关系。循环调用其实就是一个死循环,除非有终结条件。

Spring中循环依赖场景有:

  • 构造器的循环依赖(构造器注入)
  • Field 属性的循环依赖(set注入)

构造器的循环依赖问题无法解决,只能拋出BeanCurrentlyInCreationException 异常;在解决属性循环依赖时,spring采用的是提前暴露对象的方法。

二、循环依赖处理机制

  • 单例 bean 构造器参数循环依赖(无法解决)
  • prototype 原型 bean循环依赖(无法解决)

对于原型bean的初始化过程中不论是通过构造器参数循环依赖还是通过setXxx方法产生循环依赖,Spring都会直接报错处理。

AbstractBeanFactory.doGetBean()方法:

在获取bean之前如果这个原型bean正在被创建则直接抛出异常。原型bean在创建之前会进行标记这个beanName正在被创建,等创建结束之后会删除标记。

总结:Spring 不支持原型 bean 的循环依赖。

单例bean通过setXxx或者@Autowired进行循环依赖

Spring 的循环依赖的理论依据基于 JAVA 的引用传递,当获得对象的引用时,对象的属性是可以延后设置的,但是构造器必须是在获取引用之前。

Spring通过setXxx或者@Autowired方法解决循环依赖其实是通过提前暴露一个ObjectFactory对象来完成的,简单来说ClassA在调用构造器完成对象初始化之后,在调用ClassA的setClassB方法之前就把ClassA实例化的对象通过ObjectFactory提前暴露到Spring容器中。

  • Spring容器初始化ClassA通过构造器初始化对象后提前暴露到Spring容器。
  • ClassA调用setClassB方法,Spring首先尝试从容器中获取ClassB,此时ClassB不存在Spring容器中。
  • Spring容器初始化ClassB,同时也会将ClassB提前暴露到Spring容器中。
  • classB调用setClassA方法,Spring从容器中获取ClassA ,因为第一步中已经提前暴露了ClassA,因此可以获取到ClassA实例。
  • ClassA通过spring容器获取到ClassB,完成了对象初始化操作。
  • 这样ClassA和ClassB都完成了对象初始化操作,解决了循环依赖问题。


Tags:Spring   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、什么是循环依赖循环依赖其实就是循环引用,也就是两个或者两个以上的 Bean 互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。注意,这里不是函数的循环调用,是对...【详细内容】
2023-05-04  Tags: Spring  点击:(0)  评论:(0)  加入收藏
环境:Spring Cloud Gateway 3.1.4路由元信息配置你可以使用元数据为每个路由配置其他参数,如下所示:spring: cloud: gateway: routes: - id: route_with_metad...【详细内容】
2023-05-04  Tags: Spring  点击:(0)  评论:(0)  加入收藏
一、前言在现代软件开发中,事务处理是必不可少的一部分。当多个操作需要作为一个整体来执行时,事务可以确保数据的完整性和一致性,并避免出现异常和错误情况。在SpringBoot框架...【详细内容】
2023-04-28  Tags: Spring  点击:(19)  评论:(0)  加入收藏
在本文中,我们将分别用Spring框架和OpenAI的API来搭建一个应用程序,用于生成图像。一、简介1、什么是Spring和OpenAISpring是一个开源的应用程序框架,可用于Java平台上构建企业...【详细内容】
2023-04-27  Tags: Spring  点击:(12)  评论:(0)  加入收藏
1 为什么要做接口防刷?如果你的服务器应用,被一些人而已攻击,写入脚本不停的刷服务端的某一个接口,这样服务端的压力聚会非常的,甚至可能给服务端带来灾难,如果是涉及支付相关的...【详细内容】
2023-04-24  Tags: Spring  点击:(21)  评论:(0)  加入收藏
这段代码展示了如何通过Java配置类的方式来配置MyBatis框架,其中涉及到数据源的配置、SqlSessionFactory的创建、SqlSessionTemplate的创建以及事务管理器的创建。@MapperSca...【详细内容】
2023-04-23  Tags: Spring  点击:(15)  评论:(0)  加入收藏
今天要聊的就是「博客管理」中全文搜索的实现,基于 SpringBoot+Vue+ES 实现,先给大家看一下效果: 全文搜索+关键字高亮,是不是和百度的效果差不多,话不多说,直接聊如何实现。 该...【详细内容】
2023-04-15  Tags: Spring  点击:(26)  评论:(0)  加入收藏
前言数据源,实际就是数据库连接池,负责管理数据库连接,在Springboot中,数据源通常以一个bean的形式存在于IOC容器中,也就是我们可以通过依赖注入的方式拿到数据源,然后再从数据源...【详细内容】
2023-04-12  Tags: Spring  点击:(8)  评论:(0)  加入收藏
前言 在日常开发中经常遇到运营审核经销商活动、任务等等类似业务需求,大部分需求中状态稳定且单一无需使用状态机,但是也会出现大量的if...else前置状态代码,也是不够那么的“...【详细内容】
2023-04-12  Tags: Spring  点击:(24)  评论:(0)  加入收藏
今天我们来讨论如何在项目开发中优雅地使用RocketMQ。本文分为三部分,第一部分实现SpringBoot与RocketMQ的整合,第二部分解决在使用RocketMQ过程中可能遇到的一些问题并解决...【详细内容】
2023-04-12  Tags: Spring  点击:(46)  评论:(0)  加入收藏
▌简易百科推荐
一、什么是循环依赖循环依赖其实就是循环引用,也就是两个或者两个以上的 Bean 互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。注意,这里不是函数的循环调用,是对...【详细内容】
2023-05-04  日拱一卒程序猿  今日头条  Tags:Spring   点击:(0)  评论:(0)  加入收藏
环境:Spring Cloud Gateway 3.1.4路由元信息配置你可以使用元数据为每个路由配置其他参数,如下所示:spring: cloud: gateway: routes: - id: route_with_metad...【详细内容】
2023-05-04  实战案例锦集    Tags:Spring Cloud   点击:(0)  评论:(0)  加入收藏
Toolformer 是一个大型语言模型,通过使用 In-Context Learning 来提高模型理解和生成适合给定上下文或情况的语言能力。它使用 API 调用来注释大量数据,然后使用这些 API 调用...【详细内容】
2023-05-04    喔家ArchiSelf  Tags:Toolformer   点击:(0)  评论:(0)  加入收藏
数字化转型是指企业将数字技术整合到业务的所有领域,从而导致其业务运营方式和向客户交付价值的根本变化。它是利用技术从根本上改进业务流程、客户体验和整体性能的战略过...【详细内容】
2023-04-17  企业网D1Net  微信公众号  Tags:数字化   点击:(17)  评论:(0)  加入收藏
计算机始祖谁都知道,电脑的学名叫做电子计算机。以人类发明这种机器的初衷,它的始祖应该是计算工具。英语里“Calculus”(计算)一词来源于拉丁语,既有“算法”的含义,也有肾脏或胆...【详细内容】
2023-04-11  智能改变世界   网易号  Tags:计算机   点击:(24)  评论:(0)  加入收藏
新技术、新产业、新业态的不断出现,各行各业都在寻找新的突破口进行转型升级,“信息化、数字化、智能化”愈来愈频繁地出现在大众视野中,关于它们概念和解说也是层出不穷、百花...【详细内容】
2023-04-04  小徐码字    Tags:信息化   点击:(4)  评论:(0)  加入收藏
作者:王佳杰引言语音唤醒(Keyword Spotting,KWS)是较为初级的语音识别任务,在2014年陈果果的工作[1]后,学界兴起大量研究,业界也获普遍应用,如智能家居(音箱、TV)、智能穿戴(TWS耳机、...【详细内容】
2023-03-21  21dB声学  今日头条  Tags:语音识别   点击:(33)  评论:(0)  加入收藏
做国外项目,免不了要和环境打交道,即使你做的是所谓的正规如亚马逊,tiktok 项目,但操作上依然少不了批量测试这个必须掌握的手法,日常中,大家对 IP 应该是最熟悉的了,知道要看 yout...【详细内容】
2023-03-13  猎者笔记  今日头条  Tags:UA   点击:(38)  评论:(0)  加入收藏
很多朋友都觉得,安装系统很简单,只要按照方法步骤来操作不久可以了嘛!但是这样想就不对了哦,安装系统不是那么容易的一件事,因为要了解的东西很多很多。比如说你的电脑配置适合安...【详细内容】
2023-02-27  韩博士装机大师官方号    Tags:电脑   点击:(42)  评论:(0)  加入收藏
那么这些技术是如何发展到今天这种形态呢,本文将以独特视角切入,带你畅读计算机的今生、前世。 Part 01引言 计算机发展史洋洋洒洒近80年,一篇短文想讲透是不现实的。但不必担...【详细内容】
2023-02-18  移动Labs  51CTO  Tags:计算机   点击:(50)  评论:(0)  加入收藏
站内最新
站内热门
站内头条