记录一次解决循环依赖

场景

写权限模块-登录验证这一块的时候,遇到了一个比较有意思的问题,循环依赖:

The dependencies of some of the beans in the application context form a cycle:userController defined in file xxx↓userServiceImpl defined in file xxxx
┌─────┐
|  EmailRegisterStrategy defined in file xxx
└─────┘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.Disconnected from the target VM, address: '127.0.0.1:12613', transport: 'socket'Process finished with exit code 1

平时面试的时候,经常问人循环依赖怎么解决,八股文有说:

在 Spring Boot 的配置文件中启用循环引用。spring:main:allow-circular-references: true

或者开启Lazy注解云云,如果有面试官这么问我,我可能要开启嘲讽模式,因为这几种方案都不是解决循环依赖的最佳策略,除非代码不需要维护或者公司就他一个开发~

WHY?为什么不推荐使用?WHY?

首先我们需要知道,一般的代码中肯定不会出现循环依赖,我这里出现是因为我的email调用了我的service中发送和检查的方法,这显然本身就不是合理的。

使用 spring.main.allow-circular-references: true 的问题

如果我使用 spring.main.allow-circular-references: true 来解决问题,将会出现以下的问题:

  1. 我刚刚提到了,我的设计不太合理,如果允许循环依赖会隐藏代码中的设计缺陷,并且后面可能会引发更多缺陷,我可以肆无忌惮的在Service中加东西 ,导致代码越来越差劲,后面拓展根本没办法拓展。
  2. 性能问题,循环依赖会导致性能问题,当依赖注入涉及大量的懒加载或延迟初始化时那么性能会出现大问题。

使用 @Lazy 注解的问题

这么聊吧,这是最 “可爱”的解决方案,小可爱都喜欢用,如果在什么ERP,什么OA使用那还好,如果在我们这种AI-ROBOT项目中使用,等于作死,懒加载的对象可能会引入不可预见的问题,尤其是在高并发或多线程环境中。
懒加载的代码约等于如下:

public class LazyLoadedService {private static Service instance;public static Service getInstance() {if (instance == null) {instance = new Service(); // Potential race condition}return instance;}
}
  1. 懒加载对象的初始化通常在首次访问时进行。如果多个线程同时访问一个尚未初始化的懒加载对象,可能会导致多个线程同时尝试初始化这个对象,从而引发线程安全问题。
  2. 当然了我们初始化一个机器人会经过大量的操作,如果用这玩意,用户会爆炸,并且会拒绝我们后续所有产品。因为:在高并发环境中,懒加载会导致初次执行时间大大增加,十分的影响性能。系统直接挂B(当然了,是在用户眼里)。
  3. 懒加载对象的初始化过程需要获取其他资源的锁,而这些资源的获取又依赖于当前线程持有的锁,会导致死锁。
  4. 喜闻乐见的内存问题,我就职于上一家单位的时候,解决不下3次生产的内存问题,每天搞到两三点,一行行去找代码才解决了,内存问题分为两种,内存溢出和内存泄漏导致的溢出,小可爱们喜欢在Map中套List,List中在引入一些杂七杂八的,这个Map和里面的东西的生命周期快赶上程序的生命周期了,当然了,懒加载对象如果没有被正确管理,会导致内存泄漏。在高并发环境下,如果大量的对象被懒加载但没有被正确释放,可能会导致内存使用迅速增加。导致宕机(这是会死人的)

最终解决

那么,有人可能会问,那我应该怎么解决呢???
答:如果你是准备面试,以上两种可爱的方案,你自己可以当然可以回答,如果你不喜欢你的公司,那么也可以使用,但是,如果你是在生产环境,你又比较看重工作,解决方案只有一个,重构循环依赖那部分的代码,别嫌麻烦,这是解决最快也是最没有隐患的一条路线!!!

结束语

去重构登录这部分代码去了!

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

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

相关文章

Web3 开发者入门手册:技能、工具和职业前景

原文:https://remote3.co/blog-post/how-to-become-a-web3-developer 作者:Paul Anderson 编译:TinTinLand Web3 是 2024 年科技领域最受瞩目的话题之一——Web3 令人激动的实用潜力可以跨越多个行业,早期采用者更有机会在未来…

亚马逊云服务器的价格真的那么贵吗?一年要花多少钱?

亚马逊Web服务(AWS)作为全球领先的云计算平台,其定价策略常常引起用户的关注。很多人可能会问:"AWS真的那么贵吗?"实际上,这个问题的答案并不是简单的"是"或"否"&#xff0c…

【大数据综合试验区1008】揭秘企业数字化转型:大数据试验区政策数据集大公开!

今天给大家分享的是国内顶级期刊中国工业经济2023年发布的最新期刊《政策赋能、数字生态与企业数字化转型——基于国家大数据综合试验区的准自然实验》文章中所使用到的数据集——国家大数据综合试验区政策数据集以及工具变量数据,该文章基于2009-2019年中国上市企业…

花键参数确定的流程是怎么样的?

继续花键的话题,今天跟小伙伴们一同学习一下:渐开线花键的参数确定的一般流程及基本方法。 前面有好几篇介绍了花键的基本参数的概念,包括规格、模数、齿数、压力角等等。以及花键的定心方式,内外花键的配合方式。那么这些参数的…

ARM架构 AArch64 基础知识介绍

介绍 aarch64是 ARM 架构的 64 位版本,它是 ARMv8 架构的一部分,被设计用来提供更高的性能和更大的地址空间,同时保持与 32 位 ARM 架构的兼容性。AArch64 是 ARMv8 的 64 位指令集架构(ISA),它提供了丰富的…

2023 最新版IntelliJ IDEA 2023.1创建Java Web前(vue3)后端(spring-boot3)分离 项目详细步骤(图文详解)

文章目录 🚩 接上篇🏳‍🌈 项目构建所需的相关工具JavaIDEAmavenNodeJSVueVisual Studio Code 🌌 后端项目创建详细步骤🛫 1、开始创建新项目🛫 2、输入项目名称、选择项目存储位置、项目管理工具&#xff…

昇思25天学习打卡营第4天|yulang

今天主要了解了数据集 Dataset,主要包含了:数据集加载、数据集迭代、数据集常用操作、 可随机访问数据集、可迭代数据集、生成器。对于生成器很好理解,用代码来造数据,可以动态地生成数据。主要作用数据集通常被用于训练模型

tampermonkey插件下载国家标准文件

#创作灵感# 最近在一个系统招标正文中看到了一些国家标准,想要把文章下载下来,方便查阅,但是“国家标准全文公开系统”网站只提供了在线预览功能,没有提供下载功能,但是公司又需要文件,在网上找了一些办法&…

gin项目部署到服务器并后台启动

文章目录 一、安装go语言环境的方式1.下载go安装包,解压,配置环境变量2.压缩项目上传到服务器并解压3.来到项目的根目录3.开放端口,运行项目 二、打包的方式1.在项目的根目录下输入以下命令2.把打包好的文件上传到服务器3.部署网站4.ssl证书 …

C++字体库开发之字体回退三

代码片段 class FontCoverage { public: using SP std::shared_ptr<FontCoverage>; virtual ~FontCoverage() default; virtual void set(int index, FontTypes::CoverageLevel level) 0; virtual FontTypes::Coverag…

004 线程的状态

文章目录 Java线程可能的状态&#xff1a; 状态名称说明NEW初始状态&#xff0c;线程被构建&#xff0c;但是还没有调用start()方法RUNNABLE运行状态&#xff0c;Java线程将操作系统中的就绪和运行两种状态笼统地称作"运行中"BLOCKED阻塞状态&#xff0c;表示线程阻…

职场办公受欢迎的电脑桌面便签,手机电脑同步的备忘录

在快节奏的职场生活中&#xff0c;有效的时间管理和信息记录变得尤为重要。为了帮助大家更好地应对工作挑战&#xff0c;好用的电脑桌面便签和手机电脑同步的备忘录&#xff0c;好用便签应运而生&#xff0c;成为了当前职场办公中的得力助手。 好用便签是一款备受青睐的电脑桌…

阿里云物联网应用层开发:第三部分,微信小程序和web客户端实现

文章目录 哔哩哔哩视频教程1、阿里云物联网平台对接微信小程序2、阿里云物联网平台对接web客户端2-1MQTT服务器编写2-2 web端Servlet部分编写备注哔哩哔哩视频教程 【阿里云物联网综合开发,STM32+ESP8266+微信小程序+web客户端一篇教程详细讲解】 https://www.bilibili.com/v…

.NET下的开源OCR项目:解锁图片文字识别的新篇章

在数字化时代&#xff0c;从图片中高效准确地提取文字信息已成为众多应用场景的迫切需求。OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术正是满足这一需求的关键技术。对于.NET开发者而言&#xff0c;幸运的是&#xff0c;存在多个开…

接私活儿神器,一款功能强大的 SaaS 快速开发平台

今天&#xff0c;推荐一个微服务 SaaS 快速开发平台系统项目&#xff0c;笔者第一次使用就有点上头&#xff0c;爱不释手&#xff0c;必须要推荐给大家。 这是我目前见过最好的微服务 SaaS 快速开发平台系统项目。功能完整&#xff0c;代码结构清晰。值得推荐。 项目介绍 本…

nginx部署多个项目;vue打包项目部署设置子路径访问;一个根域名(端口)配置多个子项目

本文解决&#xff1a; vue打包项目部署设置子路径访问&#xff1b;nginx部署多个子项目&#xff1b;一个ip/域名 端口 配置多个子项目&#xff1b;配置后&#xff0c;项目能访问&#xff0c;但是刷新页面就丢失的问题 注&#xff1a;本文需要nginx配置基础。基础不牢的可见文…

致力于打造一个操作最简单、功能最全面、创意最丰富的聊天记录管理工具

管理您的聊天数据 下载&#xff1a;https://download.csdn.net/download/mo3408/89497474 提供数据获取、导出、分析全栈式解决方案 获取信息 一键式操作&#xff0c;数据信手拈来 导出聊天记录 批量导出、自定义时间、消息类型任意选、Word、Excel、HTML、TXT想要哪个勾哪个…

在地图上根据经纬度,画一个矩型围栏,设置每个点的经纬度

在做一个需求时有一个小点就是添加一个配送区域(5公里直径内的)矩形围栏 我做的比较简单 大家看看有没有帮助, 也是精简代码。测试效果上相对是精准的 //谷歌&#xff0c;根据经纬度获取以它为中心半径为5公里内的矩形的四个点经纬度getDefalutPoints (lng: number, lat: num…

adb push 报错 ...error: failed to copy...

一、现象&#xff1a; 原因&#xff1a;没有权限导致的 二、解决方法&#xff1a; adb root adb remount #重新加载文件系统三、再次尝试&#xff1a;adb push xxx.apk /system/app 结果&#xff1a;成功

猫咖老板教你一招解决猫浮毛问题,质量好的猫用空气净化器分享

作为一名猫咖店老板&#xff0c;我经常被朋友问到关于宠物空气净化器的各种问题。有人认为这是个神器&#xff0c;而有人则认为这完全是花钱买智商税。其实我刚开始对购买宠物空气净化器也持怀疑态度&#xff0c;心想这么多钱花下去真的有效吗&#xff1f;但使用后&#xff0c;…