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

news2024/11/16 10:50:58

一、概述

循环依赖是指,多个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时,将会报错。

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

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

相关文章

Android14 WMS启动流程

一 概述 本文Android14源代码可参考&#xff1a;Search 在 Android 系统中&#xff0c;从设计的角度来看&#xff0c;窗口管理系统是基于 C/S 模式的。整个窗口系统分为服务端和客户端两大部分&#xff0c;客户端负责请求创建窗口和使用窗口&#xff0c;服务端完成窗口的维护…

智慧工地管理系统源码-数字孪生智慧工地可视化解决方案

一、智慧工地建设背景 我国经济发展正从传统粗放式的高速增长阶段&#xff0c;进入高效率、低成本、可持续的中高速增长阶段。随着现代建筑的复杂度和体量等不断增加&#xff0c;施工现场管理的内容越来越多&#xff0c;管理的技术难度和要求在不断提高。传统的施工现场管理模…

用超声波清洗机洗眼镜的有哪些?清洁力强的超声波清洗机不能错过

超声波清洗机在清洗眼镜方面表现出色&#xff0c;其强大的清洁能力可以彻底清除眼镜上的污垢和细菌。这种清洗方式被认为是一种高效且卫生的清洁方式&#xff0c;因为它利用高频振动和微射流打击力来清除污垢和细菌&#xff0c;而不是使用化学物质。对于那些长时间佩戴眼镜或者…

windows + ubuntu + vscode开发环境配置安装

一、卸载WSL/WSL2 如果安装了windows子系统的朋友&#xff0c;可以选择继续使用。或者提前卸载WSL&#xff0c;再选择安装虚拟机。虚拟机占用内存较大&#xff0c;WSL可能对于开发的一些需求还有欠缺。根据自己的实际情况进行选择。 WIN10/11安装WSL(请参考官方资料&#xff0c…

TSINGSEE青犀智慧仓储可视化视频智能监管系统方案

一、背景与需求 对于现在很多大型工厂或者物流基地来说&#xff0c;仓库无疑是存放物品的重点场所。仓储存放着大量货物&#xff0c;同时存在大量的辅助设备&#xff0c;需要进行全方位的监管&#xff0c;以避免发生安全事故&#xff0c;造成财产损失。原有的人工巡检方式已无…

Ubuntu安装AdGuardhome(树莓派安装AdGuardhome)

Ubuntu安装AdGuardhome&树莓派安装AdGuardhome 1.什么是AdGuardhome2.设备情况3.3.1.下载AdGuardhome3.2.解压3.3.安装3.4.仪表盘配置3.5.dns黑名单添加3.6.DNS白名单设置3.7常规设置3.8. dns设置3.9.加密设置 4.客户端设置 1.什么是AdGuardhome AdGuard Home 是网络范围的…

传奇服务器配置如何搭建

传奇服务器在中国页游发展中作为一个经典制作吸引了很多玩家的喜欢&#xff0c;很多人也想搭建一个属于自己团队的传奇游戏服务器&#xff0c;今天就让小编来讲一讲该如何搭建吧&#xff01; 首先是硬件配置&#xff0c;传奇游戏的服务器需要较高的硬件配置&#xff0c;选择双路…

Kubernetes数据卷Volume和数据卷分类(emptyDir、nfs、hostPath、ConfigMap)详解

Kubernetes数据卷Volume和数据卷分类详解 数据卷概述 Kubernetes Volume&#xff08;数据卷&#xff09;主要解决了如下两方面问题&#xff1a; 数据持久性&#xff1a;通常情况下&#xff0c;容器运行起来之后&#xff0c;写入到其文件系统的文件暂时性的。当容器崩溃后&am…

window系统修改rabbitmq 默认端口

安装完rabbitmq之后&#xff0c;默认的client端口是5672, 控制台访问端口是15672&#xff0c;rabbitmq管理工具启动之后在浏览器中输入地址&#xff1a; ​ ​http://localhost:15672/​​​ 就可以访问后台​ ​​​&#xff0c; 默认管理员账号&#xff1a;guest 密码&#x…

移动云获取推拉流地址

一&#xff1a;帮助文档&#xff1a; 移动云帮助中心https://ecloud.10086.cn/op-help-center/doc/category/753 二&#xff1a;准备工作&#xff1a; 1&#xff1a;进入移动云首页&#xff0c;点击【产品】>【视频服务】>【视频服务】>【视频直播】 点击【立即订购…

图纸管理制度 《五》

1、存档文件应由专人管理&#xff0c;其他人未征得管理人员同意&#xff0c;不得随意翻阅查看。 2、档案管理人员要认真贯彻执行公司相关制度&#xff0c;严禁泄露档案材料中的秘密。 彩虹图纸管理软件_图纸管理系统_图纸文档管理软件系统_彩虹EDM【官网】彩虹EDM图纸管理软件…

Linux进程控制/进程终止

一、系统调用fork函数 1、fork返回值及内核操作 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回 0 &#xff0c;父进程返回子进程 id &#xff0c;出错返回 -1 进程调用fork&#xff0c;当控制转移到内核中的fork代码后&#xff0c;内核做&am…

UE4 体积云制作 学习笔记

首先Noise本来就是一张噪点图 云的扰动不能太大&#xff0c;将Scale调小&#xff0c;并将InputMin调整为0 形成这样一张扰动图 扰动需要根据材质在世界的位置进行调整&#xff0c;所以Position需要加上WorldPosition 材质在不同世界位置&#xff0c;噪点不同 除以一个数&#…

会声会影2024(Corel VideoStudio)正式版安装下载步骤教程

众所周知会声会影(Corel VideoStudio)2024为加拿大Corel公司发布的一款功能丰富的视频编辑软件。实际上我们可以这样讲添加样子和款式&#xff1a;使用数百种创意拖放效果和滤镜增个性和艺术格调。值得肯定的是添加趣味性3D标题&#xff0c;内置NewBlueFX和proDAD转场和防抖插件…

基于头脑风暴算法的无人机航迹规划-附代码

基于头脑风暴算法的无人机航迹规划 文章目录 基于头脑风暴算法的无人机航迹规划1.头脑风暴搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用头脑风暴算法来优化无人机航迹规划。 …

矩阵特征值与特征向量的理解

各位朋友大家好&#xff0c;我是小C哈哈哈&#xff0c;很高兴认识大家&#xff0c;在这里&#xff0c;我会将一些枯燥难懂的数学和算法知识以图片或动画的形式通俗易懂的展现给大家&#xff0c;希望大家喜欢。 线性代数中的矩阵特征值与特征向量这两个基本概念总是让很多人摸不…

接口自动化框架篇:流程封装与基于加密接口的测试用例设计

​接口测试仅仅掌握 Requests 或者其他一些功能强大的库的用法&#xff0c;是远远不够的&#xff0c;还需要具备能根据公司的业务流程以及需求去定制化一个接口自动化测试框架的能力。所以&#xff0c;接下来&#xff0c;我们主要介绍下接口测试用例分析以及通用的流程封装是如…

nginx配置域名(ssl和非ssl形式)

概要 本文以阿里云为例&#xff0c;浅要介绍如何将域名指向你的服务器&#xff0c;以及如何配置ssl和非ssl的方式。 购买域名 购买域名不做描述&#xff0c;本文域名以helloword.com为例 域名实名与备案 购买后&#xff0c;不实名和备案是无法使用的&#xff0c;这里不展开…

Games 103 作业二

Games 103 作业二 作业二其实就是要使用隐式积分和PBD两种方式来实现布料求解。难度相对于作业一来说要简单一些&#xff0c;在文档中基本把步骤都写清楚了。主要逻辑首先参考Lecture 05 PPT的第18页&#xff1a; 然后我们按照文档的步骤一步一步地来。注意0号顶点和20号顶点是…

JSX基础语法

文章目录 认识JSX语法JSX是什么为什么Rect选择了JSXJSX书写规范JSX注释编写 JSX的基本使用JSX的事件绑定this绑定问题参数传递问题 JSX的条件渲染常见的条件渲染方式 JSX的列表渲染JSX的原理和本质JSX的本质虚拟DOM的创建过程 案例练习 认识JSX语法 // 1. 定义根组件 const el…