【SpringBoot循环依赖】解决循环依赖

我的项目中,报错:

Description:The dependencies of some of the beans in the application context form a cycle:frontIndexController
┌─────┐
|  systemConfigService
└─────┘Action:Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.

问题描述
frontIndexController:这似乎是一个控制器类,负责处理前端请求。
systemConfigService:这可能是一个服务类,处理系统配置相关的业务逻辑。
Spring框架默认禁止循环依赖,因为这通常意味着设计上的问题,可能导致内存泄漏、初始化问题或难以预料的行为。

解决策略

1. 重构以消除循环依赖

最佳实践是重新设计你的类,消除循环依赖。具体到你的场景,可以考虑以下几点:

职责分离:确保每个Bean只负责单一职责。如果frontIndexController和systemConfigService互相依赖,可能意味着它们之间的职责划分不够清晰。
引入中间层:如果两个Bean确实需要相互通信,可以考虑引入一个新的Bean作为中介,持有必要的信息,以打破循环依赖。

2. 使用@Lazy注解

如果循环依赖是由于构造器注入引起的,并且逻辑上可以接受延迟初始化(即在首次实际使用时才初始化Bean),可以在其中一个Bean的依赖注入点使用@Lazy注解。

例如,如果frontIndexController在初始化时不立即需要systemConfigService的完整功能,可以在frontIndexController中对systemConfigService的依赖添加@Lazy:

@Resource
@Lazy
private SystemConfigService systemConfigService;

这会让Spring在注入systemConfigService时,仅创建一个代理对象,直到真正调用时才去初始化systemConfigService,从而打破了循环依赖。

3. 作为最后手段:允许循环依赖

虽然不推荐,但如果你确定循环依赖是合理的,并且上述方法都无法应用,可以通过设置Spring属性来允许循环依赖:

在application.properties或application.yml中添加:

# application.properties
spring.main.allow-circular-references=trueYaml
# application.yml
spring:main:allow-circular-references: true

但请注意,这可能引入难以预料的问题,特别是与依赖管理和生命周期管理相关的问题。

结论

推荐优先考虑重构以解决循环依赖问题,确保应用的结构清晰、健壮。只有在彻底分析并确认没有更好的解决方案时,才考虑使用@Lazy或允许循环依赖的配置。

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

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

相关文章

ingress-nginx部署-helm方式

helm 安装ingress-nginx Ingress-Nginx Controller 支持多种方式安装: 使用heml安装chart使用kubectl apply,使用YAML文件; 详情可参考:https://kubernetes.github.io/ingress-nginx/deploy/ 本文实践使用helm安装ingress-ngi…

【工具推荐】ONLYOFFICE8.1版本编辑器测评——时下的办公利器

文章目录 一、产品介绍1. ONLYOFFICE 8.1简介2. 多元化多功能的编辑器 二、产品体验1. 云端协作空间2. 桌面编辑器本地版 三、产品界面设计1. 本地版本2. 云端版本 四、产品文档处理1. 文本文档(Word)2. 电子表格(Excel)3. PDF表单&#xff0…

如何学习MyBatis 源码

MyBatis 源码分析是一个深入的话题,涉及到框架的内部实现细节。下面是一些基本介绍和指导: 整体认识 MyBatis 源码结构 核心模块:MyBatis 的核心模块包括 Configuration、Executor、StatementHandler、ParameterHandler、ResultSetHandler 等…

【C++ | 继承】|概念、方式、特性、作用域、6类默认函数

继承 1.继承的概念与定义2.继承的方式2.1继承基本特性2.2继承的作用域2.2.1隐藏赋值兼容 派生类的创建和销毁构造函数拷贝构造赋值重载 1.继承的概念与定义 继承是面向对象编程中的一个重要概念。它的由来可以追溯到软件开发中的模块化设计和代码复用的需求。 在软件开发过程…

mq消息堆积

通常情况下,出现消息积压的原因有 mq消费者挂了mq生产者生产消息的速度,大于mq消费者消费消息的速度 当数据量不大时,优化消费者处理逻辑 通过在代码中增加了一些日志,把mq消费者中各个关键节点的耗时都打印出来,发现有…

从零搭建Java酒店预订系统:实战指南_02

第四步,用户注册和登录 创建用户服务接口 在src/main/java目录下创建com.example.hotelbookingsystem.service包,并在该包下创建UserService接口: package com.example.hotelbookingsystem.service;import com.example.hotelbookingsystem.entity.User;public int…

【Android面试八股文】性能优化相关面试题: 什么是内存抖动?什么是内存泄漏?

文章目录 一、什么是内存抖动?内存抖动的问题卡顿OOM(Out Of Memory)二、什么是内存泄漏(Memory Leak)?引用计数法可达性分析法一、什么是内存抖动? 在Java中,每创建一个对象,就会申请一块内存,存储对象信息; 每分配一块内存,程序的可用内存也就少一块; 当程序…

电池企业如何通过部署PLM系统提升自身竞争力

产品生命周期管理(PLM,Product Lifecycle Management)是一种集成的企业信息化管理解决方案,旨在管理产品从概念设计、研发、生产、使用到退役的整个生命周期。PLM系统通过信息化手段,将企业的各个环节紧密连接在一起&a…

中英双语介绍美国的州:佛罗里达州(Florida)

中文版 佛罗里达州(Florida)位于美国东南部,因其温暖的气候、丰富的旅游资源和多样化的文化背景而闻名。以下是对佛罗里达州各方面的详细介绍: 人口 截至2020年,美国人口普查数据显示,佛罗里达州的人口约…

什么是协程?协程和线程的区别

文章目录 前置知识应用程序和内核阻塞和非阻塞同步和异步并发和并行IO 发展历史同步编程异步多线程/进程异步消息 回调函数(响应式编程) 协程协程基本概念go 示例代码协程和线程的区别 个人简介 前置知识 在了解协程前,我们先理解一些相关的…

强化学习原理入门-1绪论

1 绪论 1.1 这是一本什么书 强化学习算法? AlphaGo大胜世界围棋冠军李世石和柯洁事件,核心算法就用到了强化学习算法。 1.2 强化学习解决什么问题 案例1 非线性系统二级倒立摆 案例2 AlphaGo与柯洁的第二局棋 案例3 机器人学习站立 ...... 智能…

数据库被后台爆破如何解决?

在数字化时代,数据库安全成为企业与组织不容忽视的关键环节。其中,“后台爆破”攻击,即通过自动化工具尝试大量的用户名和密码组合,以非法获取数据库访问权限,是常见的安全威胁之一。本文将详细介绍如何识别、防御并解…

websocket使用,spring boot + vite + vue3

websocket使用,spring boot vite vue3 Websocket是什么WebSocket 服务端构建websocket 服务实现处理器pom文件 客户端仓库地址 Websocket是什么 WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层。…

沙箱在“一机两用”新规下的价值体现

在数字化时代,随着企业信息化建设的深入,数据安全问题愈发凸显其重要性。一机两用新规的出台,旨在通过技术创新和管理手段,实现终端设备的安全可控,确保敏感数据的安全存储与传输。SDC沙箱技术作为一种创新的安全防护手…

springcloud-config服务器,同样的配置在linux环境下不生效

原本在windows下能争取的获取远程配置但是部署到linux上死活都没有内容,然后开始了远程调试,这里顺带讲解下获取配置文件如果使用的是Git源,config service是如何响应接口并返回配置信息的。先说问题,我的服务名原本是abc-abc-abc…

图像基础知识入门【图像概念不同图像格式】

图像基础知识入门【图像概念&不同图像格式】 最近有在处理图像转换,因此稍微补足了一下图像相关知识,特在此记录。下面汇总是我根据自己理解和网上查阅资料而来。如有错误,欢迎大家指正。 1 基础概念 像素/分辨率 像素(Pixel)&#xff…

高德定位获取详细位置失败的处理方法

在使用高德地图定位功能获取位置信息有时候会获取详细位置失败,但是经纬度是有的,这种情况下怎么处理呢,可以使用逆地理编码通过返回的经纬度来再次获取位置信息,如果再次失败那么获取详细位置信息就失败了。 具体工具类如下: package com.demo.map.utils;import androi…

如何实现电子签名签章功能?

随着技术的发展,传统的纸质合同签署方式逐渐暴露出效率低下、存储不便和安全性不足等问题。为了解决这些问题,电子签署服务为用户提供了一个安全、高效、环保的合同管理解决方案。 电子合同管理与签署平台的核心功能 1、用户管理:平台提供用…

怎么永久禁止win10系统自动更新?一键屏蔽系统自动更新

现在 Windows 10 系统是很多办公用户的主力操作系统,可是 Windows 系统会自动更新,这会严重影响系统稳定性。因为微软虽然以提供更新为服务,但并不是每次更新它都是安全的。 接下来和我一起看看如何使用联想开发的小工具一键屏蔽系统自动更新…