The dependencies of some of the beans in the application context form a cycle

news2024/11/14 12:21:05

你们好,我是金金金。

image.png

场景

在这里插入图片描述

  • 启动服务时,报错:应用程序上下文中的某些bean的依赖关系形成了一个循环

循环依赖

依赖循环指的是两个或多个类之间相互依赖的情况,即类A依赖类B,同时类B也依赖类A。 这种情况会导致编译器无法确定类的加载顺序,从而产生编译错误

在这里插入图片描述

  • 如上图:BeanA 类依赖了 BeanB 类,同时 BeanB 类又依赖了 BeanA 类。这种依赖关系形成了一个闭环,这种依赖关系就称之为循环依赖

排查

从报错信息可以得知,这是一个依赖循环的问题~,问题出在MqConfigrabbitTemplateConfigurer这两者形成了相互依赖,从而产生了依赖循环

  • 从报错得知,整理的依赖顺序如下~

    payController 依赖于 payOrderServiceImpl

    payOrderServiceImpl 依赖于 MqConfig

    MqConfig 依赖于 rabbitTemplate

    rabbitTemplate 依赖于 rabbitTemplateConfigurer

    rabbitTemplateConfigurer 依赖于 MqConfig
  • 好,一步步来,走起~
  1. 我先贴出MqConfigRabbitMqHelper代码

    Mq.config.java
    在这里插入图片描述

    RabbitMqHelper.java
    在这里插入图片描述

  2. 从报错开始排查,首先看PayController,这里面使用了IPayOrderService那必然有依赖关系

    在这里插入图片描述

  3. 再继续看payOrderServiceImpl

    在这里插入图片描述

    • PayOrderServiceImpl里面使用到了rabbitMqHelper,而rabbitMqHelper又是在MqConfig里面注册为一个Bean的,所以也就是为什么payOrderServiceImpl依赖于MqConfig的原因了~
  4. 继续走,我们看一下MqConfig,其实上面也有贴出MqConfig的详细代码了,我这里再放一遍

    在这里插入图片描述

    • 从报错显示,MqConfig依赖于rabbitTemplate,这很明显了,因为我MqConfig里面有使用到rabbitTemplate,所以也存在着依赖关系
  5. 继续,我们可以看到rabbitTemplate依赖于rabbitTemplateConfigurer,这里得看一下源码了,跟着节奏,走起

    • 我们来到RabbitAutoConfiguration 里面,可以看到三个内部类

      在这里插入图片描述

    • 根据报错得知rabbitTemplate依赖于rabbitTemplateConfigurer,来看下RabbitTemplateConfiguration这个内部类究竟是什么?

      在这里插入图片描述

      • 现在就很明显了,可以看到rabbitTemplate就在RabbitTemplateConfiguration内部类当中,rabbitTemplate在这个内部类当中注册为了Bean,而且这个Bean是依赖于RabbitTemplateConfigurer的,所以也就是为什么rabbitTemplate依赖于rabbitTemplateConfigurer
  6. 好,现在也就是最后一点,rabbitTemplateConfigurer为什么又依赖于MqConfig呢,这两者导致了依赖循环

  • 首先看下rabbitTemplateConfigurer方法,从源码可以得知 参数里面需要一个ObjectProvider messageConverter消息转换器

    在这里插入图片描述

  • 我在MqConfig里面 也自定义了一个消息转换器,问题就出在这里

    在这里插入图片描述

造成error的原因

MqConfig依赖于rabbitTemplate

rabbitTemplate的自动注入需要有MessageConverter

而我又在MqConfig自定义了MessageConverter

MqConfig需要rabbitTemplate,由于我定义了消息转换器,而rabbitTemplate又会使用到MqConfig
反反复复,就形成了循环依赖

解决

  • 知道了错误的原因,解决起来就很简单了,就是因为 MqConfig需要rabbitTemplate,由于我定义了消息转换器,而rabbitTemplate又会使用到MqConfig 这个问题所导致循环依赖。

第一种解决方案

  • 把消息转换器放到别的配置类中去,这样就可以避免rabbitTemplate去找MqConfig

    在这里插入图片描述

第二种解决方案

  • 要么就把MqConfig类中的rabbitTemplate以及init方法拿走,直接切断关系使MqConfig 不依赖于 rabbitTemplate,我选择放在我的RabbitMqHelper类当中

    在这里插入图片描述

测试

  • 完美启动,不报错了~

    在这里插入图片描述

总结

依赖循环导致的问题,切断两者互相依赖关系即可~

  • 编写有误还请大佬指正,万分感谢。

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

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

相关文章

java接口只能定义抽象方法吗?

写在前面 在Java中接口时作为规范来存在的&#xff0c;那么除了抽象方法&#xff0c;接口中还能定义其他方法吗?比如静态方法&#xff1f;本文一起来看下。 1&#xff1a;正文 这并不是一个绝对的是和否的问题&#xff0c;不同的jdk版本表现不同&#xff0c;在<1.7的版本…

用例管理框架

用例管理框架之pytest单元测试框架&#xff08;上&#xff09; 一、pytest用例管理框架&#xff08;单元测试框架&#xff09; 1.分类&#xff1a; python&#xff1a;unittest&#xff0c;pytest 必须非常熟练 2.主要作用&#xff1a; 发现测试用例&#xff1a;从多个py文…

深入理解 C 语言中的联合体

目录 引言 一、 联合体的定义与基本用法 1.联合体的定义 2.基本用法 二、 联合体与结构体的区别 1.结构体 2.联合体 3.对比 ​编辑三、联合体的优势 1. 节省内存 2. 提高效率 3. 代码简洁性 四、联合体的存储细节 1.内存对齐 2.大小计算 五、联合体的高级用法…

Windows内核态开发笔记

文章目录 r3/r0通信x64 HOOK回调监控进程强杀minifilterObRegisterCallbacksWFP后记 r3/r0通信 用户态 #include <Windows.h> #include <stdio.h>#define SENDSTR CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) void main() {HANDLE …

Reader

FileInputStream和FileOutputStream其实还叫字节输入流和字节输出流。关于输入和输出这2个总是有点模糊。 以内存为基准&#xff0c;InputStream是文件流向内存&#xff0c;就是从文件中读取数据&#xff0c;又称为输入流。 OutputStream是从内存中流向文件&#xff0c;就是向…

使用s3cmd 2.x 与 Cyberduck 管理在 DigitalOcean Spaces 对象存储中的数据

有很多用户在使用 DigitalOcean Spaces 对象存储的过程中&#xff0c;还没有找到一个合适的数据管理工具。其实目前有很多开源工具都可以使用&#xff0c;比如 s3cmd、Cyberduck、rclone、transmit5。Cyberduck 提供了直观的图形用户界面&#xff0c;而 s3cmd 2.x 则擅长于批处…

怎么搭建AI带货直播间生成虚拟主播?

随着电商直播带货的热潮不断升温&#xff0c;虚拟主播逐渐崭露头角&#xff0c;成为电商直播领域的新宠&#xff0c;相较于真人主播&#xff0c;虚拟主播具备无档期风险、人设稳定可控、24小时不间断直播等显著优势。 本文将深入探讨如何搭建一个AI带货直播间&#xff0c;并详…

最新小猫咪PHP加密系统源码V1.4_本地API接口_带后台

简介&#xff1a; 最新小猫咪PHP加密系统源码V1.4_完全本地化加密API接口_带后台 小猫咪PHP加密系统历时半年&#xff0c;它再一次迎来更新&#xff0c;更新加密算法&#xff08;这应该是最后一次更新加密算法了&#xff0c;以后主要更新都在框架功能上面了&#xff09;&…

在WordPress上启用reCAPTCHA的指南

随着网络安全问题的日益严重&#xff0c;网站管理员必须采取措施保护自己的网站免受恶意攻击。对于WordPress用户来说&#xff0c;可以通过启用谷歌的reCAPTCHA功能来增强网站的安全性。本文将介绍两种在WordPress上启用reCAPTCHA的方法&#xff1a;使用插件和手动添加代码。 一…

Git基础:使用指南

Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。分布式相比于集中式的最大区别在于开发者可以提交到本地&#xff0c;每个开发者通过克隆&#xff0c;在本地机器上拷贝一个完整的Git仓库。 一、版本管理 1.1 创建版本库 版…

大模型的架构参数是指定义模型基本结构和组成的各种参数,这些参数对模型的性能、训练效率和泛化能力具有重要影响。以下是对大模型架构参数的详细介绍

大模型架构参数 大模型的架构参数是指定义模型基本结构和组成的各种参数&#xff0c;这些参数对模型的性能、训练效率和泛化能力具有重要影响。以下是对大模型架构参数的详细介绍&#xff1a; 一、基本结构和组成 层数&#xff1a;模型的层数是指模型中全连接网络或特定结构…

vue3直播视频流easy-player

vue3直播视频流easy-player <script src"/easyPlayer/EasyPlayer-element.min.js"></script> easyPlayer文件下载地址 https://download.csdn.net/download/weixin_42120669/89605739 <template><div class"container"><div …

Vue进阶之Vue无代码可视化项目(九)

Vue无代码可视化项目—补充内容 背景介绍、方案设计Canvas Table创建一个新的vue项目普通表格的效果Canvas上手Canvas画表格-画基本表格CanvasTable处理事件系统CanvasTable表格滚动Vue组件封装思想拖拽组件 —smooth-dndDndDemo1.vueDndContainer.jsCanvasTable封装CanvasTabl…

LDR6020 iPad皮套一体式键盘充电方案解析

在移动办公与学习的浪潮中&#xff0c;iPad凭借其强大的性能与便携性&#xff0c;成为了越来越多人的首选设备。然而&#xff0c;随着工作与学习任务的日益复杂&#xff0c;单一的触控操作已难以满足高效、精准的需求。因此&#xff0c;搭配一款优秀的键盘成为了提升iPad使用体…

月木学途开发 3.1搭建CentOS虚拟机

安装CentOS 下载地址 &#xff1a;https://mirrors.aliyun.com/centos-vault/?spma2c6h.13651104.0.0.5f6612b2O7Cy9G 选择7.6.1810——isos——x86_64——CentOS-7-x86_64-DVD-1810.iso 安装 VMWare虚拟机 下载 下载地址&#xff1a;https://www.vmware.com/products/desktop…

分享c语言中一些实用的函数2

目录 一.头文件 1.sqrt()函数 2.sin&#xff0c;cos&#xff0c;tan函数 附加:宏定义π 3.exp函数 4.fabs函数 5.fmax函数 6.floor函数 7.log函数 附加&#xff1a;求一个数是几为数(运用floor函数和log函数) 8.pow函数 二.头文件 1.abs函数 附加: 一.头文件<…

详解HTTP协议版本(HTTP/1.0、1.1、2.0、3.0区别)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

数据采集器

目录 1. 采集Redis 2. 采集MySQL 3. 采集容器 1. 采集Redis 出口商和集成 |普罗 米修斯 (prometheus.io) 发布 奥利弗006/redis_exporter (github.com) 在目标机器上安装redis 上传redis采集器包redis_exporter-v1.53.0.linux-amd64.tar.gz [rootharbor opt]# tar -xf …

web3 solana

网址&#xff1a;HACKQUEST 学习初衷&#xff1a; 1.web3概念较为小众&#xff0c;相比于web2&#xff0c;机会较多 2.有机会remote work&#xff0c;带着笔记本到处浪&#xff0c;听着就不错 3.面对越来越卷的国内&#xff0c;有机会并有能力拥抱国外job&#xff0c;感觉是…

安卓车载多屏互动副屏底部有黑线条NavigationBar分析

背景&#xff1a; 在学习了马哥的wms和多屏互动课程后&#xff0c;大家普遍都可以跟着做出如下图效果的多屏互动&#xff1a; 其实初略来看这个成果已经完成一个多屏互动项目大部分功能&#xff0c;但是其实还是有一些bug的存在&#xff0c;今天我们就来分析一下多屏互动相关的…