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

系列十九、循环依赖(一)

一、概述

循环依赖是指,多个bean之间相互依赖,形成了一个闭环。比如A依赖于B、B依赖于C、C依赖于A,形成了一个圈。

二、两种方式对循环依赖的影响

2.1、官网说明

2.2、结论

        我们AB循环依赖问题只要A的注入方式是setter、并且是singleton,就不会出现循环依赖问题。

三、BeanCurrentlyInCreationException

3.1、构造方法注入

3.1.1、ServiceA

/*** @Author : 一叶浮萍归大海* @Date: 2023/10/27 23:27* @Description:*/
public class ServiceA {private ServiceB serviceB;public ServiceA(ServiceB serviceB) {this.serviceB = serviceB;System.out.println("构造方法:A中设置了属性B");}
}

3.1.2、ServiceB

/*** @Author : 一叶浮萍归大海* @Date: 2023/10/27 23:27* @Description:*/
public class ServiceB {private ServiceA serviceA;public ServiceB(ServiceA serviceA) {this.serviceA = serviceA;System.out.println("构造方法:B中设置了属性A");}
}

3.1.3、xml配置

<!-- 使用构造方法注入属性:会产生循环依赖问题 -->
<bean id="a" class="org.star.component.inject.constructor.ServiceA"><constructor-arg name="serviceB" ref="b"/>
</bean>
<bean id="b" class="org.star.component.inject.constructor.ServiceB"><constructor-arg name="serviceA" ref="a"/>
</bean>

3.1.4、测试

/*** @Author : 一叶浮萍归大海* @Date: 2023/10/27 23:23* @Description:*/
public class SpringCircularDependencyMainApp {public static void main(String[] args) {m1();}/*** 使用构造方法注入属性:会产生循环依赖问题*/private static void m1() {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");ServiceA serviceA = context.getBean(ServiceA.class);System.out.println(serviceA);}}

3.1.5、结论

使用构造方法注入属性:会产生循环依赖问题。

3.2、set方法注入

3.2.1、ServiceAA

/*** @Author : 一叶浮萍归大海* @Date: 2023/10/27 23:30* @Description:*/
public class ServiceAA {private ServiceBB serviceBB;public ServiceBB getServiceBB() {return serviceBB;}public void setServiceBB(ServiceBB serviceBB) {this.serviceBB = serviceBB;System.out.println("aa里面设置了属性bb");}
}

3.2.2、ServiceBB

/*** @Author : 一叶浮萍归大海* @Date: 2023/10/27 23:30* @Description:*/
public class ServiceBB {private ServiceAA serviceAA;public ServiceAA getServiceAA() {return serviceAA;}public void setServiceAA(ServiceAA serviceAA) {this.serviceAA = serviceAA;System.out.println("bb里面设置了属性aa");}
}

3.2.3、xml配置

<!-- 使用set方法注入属性:不会产生循环依赖问题 -->
<bean id="aa" class="org.star.component.inject.setter.ServiceAA"><property name="serviceBB" ref="bb"/>
</bean>
<bean id="bb" class="org.star.component.inject.setter.ServiceBB"><property name="serviceAA" ref="aa"/>
</bean>

3.2.4、测试

/*** @Author : 一叶浮萍归大海* @Date: 2023/10/27 23:23* @Description:*/
public class SpringCircularDependencyMainApp {public static void main(String[] args) {m2();}/*** 使用set方法注入属性:不会产生循环依赖问题*/private static void m2() {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");ServiceAA aa = context.getBean(ServiceAA.class);ServiceBB bb = context.getBean(ServiceBB.class);System.out.println(aa);System.out.println(bb);}
}

yH5BAAAAAAALAAAAAAOAA4AAAIMhI+py+0Po5y02qsKADs=wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

3.2.5、结论

使用set方法注入属性:不会产生循环依赖问题

3.3、注意事项

默认的单例bean是支持循环依赖的,但是当把scope的值改为prototype时,将会报错。

相关文章:

  • 【100天精通Python】Day72:Python可视化_一文掌握Seaborn库的使用《二》_分类数据可视化,线性模型和参数拟合的可视化,示例+代码
  • 面试软件测试时,面试官最想听到的答案是什么?
  • 3.72 Command Buffer及URP概述
  • JVM相关的面试题
  • 电脑怎么共享屏幕?电脑屏幕共享软件分享!
  • SAP业务从ECC升级到SAP S/4HANA有哪些变化?有哪些功能得到增强?
  • 【wespeaker】模型ECAPA_TDNN介绍
  • 【机器学习合集】泛化与正则化合集 ->(个人学习记录笔记)
  • Kafka入门05——基础知识
  • 二叉树的概念
  • uni-app——如何阻止事件冒泡
  • 97. 交错字符串
  • ES Nested解释
  • eslint识别不了别名解决方法
  • H5游戏源码分享-考眼力游戏猜猜金币在哪
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • #Java异常处理
  • ECMAScript入门(七)--Module语法
  • go语言学习初探(一)
  • HTML-表单
  • javascript面向对象之创建对象
  • mysql_config not found
  • PaddlePaddle-GitHub的正确打开姿势
  • Redash本地开发环境搭建
  • unity如何实现一个固定宽度的orthagraphic相机
  • Vue学习第二天
  • windows下使用nginx调试简介
  • 彻底搞懂浏览器Event-loop
  • 关于extract.autodesk.io的一些说明
  • 计算机在识别图像时“看到”了什么?
  • 解析带emoji和链接的聊天系统消息
  • 坑!为什么View.startAnimation不起作用?
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用putty远程连接linux
  • 我有几个粽子,和一个故事
  • 线上 python http server profile 实践
  • 用Visual Studio开发以太坊智能合约
  • scrapy中间件源码分析及常用中间件大全
  • (Git) gitignore基础使用
  • (k8s中)docker netty OOM问题记录
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (八)c52学习之旅-中断实验
  • (分享)自己整理的一些简单awk实用语句
  • (译) 函数式 JS #1:简介
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • ./configure,make,make install的作用
  • .NET 分布式技术比较
  • .NET/C# 使用反射注册事件
  • .net分布式压力测试工具(Beetle.DT)
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [C++] 统计程序耗时
  • [C++]高精度 bign (重载运算符版本)
  • [LeetCode] Ransom Note 赎金条