记录一次解决循环依赖

news2024/7/7 18:15:18

场景

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

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.coloradmin.cn/o/1894504.html

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

相关文章

如视“VR+AI”实力闪耀2024世界人工智能大会

7月4日,2024世界人工智能大会暨人工智能全球治理高级别会议(以下简称为“WAIC 2024”)在上海盛大开幕,本届大会由外交部、国家发展和改革委员会、教育部等部门共同主办,围绕“以共商促共享 以善治促善智”主题&#xf…

【虚拟机】虚拟机网络无法访问问题【已解决】

【虚拟机】虚拟机无法上网问题【已解决】 问题探究解决方法法1:查看相关“网络服务”是否处于正常启动状态法2:重启网络法3:重新安装VMWare法4:使用NAT模式,每次打开win7都没连上网的解决办法 问题探究 安装了很多个虚…

昇思MindSpore学习总结八——静态图加速

AI编译框架分为两种运行模式,分别是动态图模式以及静态图模式。MindSpore默认情况下是以动态图模式运行,但也支持手工切换为静态图模式。两种运行模式的详细介绍如下: 1、动态图模式 动态图的特点是计算图的构建和计算同时发生(D…

vue模板语法v-html

模板语法v-html vue使用一种基于HTML的模板语法,使我们能够声明式的将其组件实例的数据绑定到呈现的DOM上,所有的vue模板都是语法层面的HTML,可以被符合规范的浏览器和HTML解释器解析。 一.文本插值 最基本的数据绑定形式是文本插值&#…

高二的他已通过NOI保送北大了,让我们一起了解他的信息学奥赛学习经历吧!!!

相信关注本号的各位,对于信息学奥赛已经不陌生了,部分同学也已经开始踏入信息学的旅程,但前路茫茫,让我们一起看看已经取得成就的同学的经历吧。 今天要介绍的这位同学,是来自深圳中学的高二某班的欧阳达晟同学&#x…

一、强化学习基本概念

一、强化学习基本概念 1.1 何为强化学习?1.2 强化学习的环境1.3 强化学习的目标1.4 强化学习的数据 1.1 何为强化学习? 强化学习(Reinforcement Learning, RL)是机器通过与环境交互来实现目标的一种计算方法。机器和环境的一轮交互是指:机器在…

Spring AI之后,阿里推出Spring Cloud Alibaba AI,接入体验篇——Java也能方便用 AI

阿里推出Spring Cloud Alibaba AI,接入体验篇——Java也能方便用 AI 1.Spring AI2.Spring Cloud Alibaba AI3. 接入体验 1.Spring AI Spring AI 是 Spring 官方社区项目,旨在简化 Java AI 应用程序开发,让 Java 开发者像使用 Spring 开发普通…

安装Anaconda找不到旧版本怎么办?

标题Anaconda官网:https://www.anaconda.com/ 对于个人学习使用,不用下载最新版本,使用之前的版本相对还是比较稳定的。所以需要寻找旧版网址。 标题旧版网址:https://repo.anaconda.com/archive/ 里面多种版本选择 然后选择自…

解决前端登录成功之后,往后端发请求携带cookie问题

项目背景: 今天在做伙伴匹配系统: 我现在实现的功能是: 在我登录成功之后,就进入了主页(默认页),在我访问用户页的时候产生的问题 首先说明一下这个Cookie的问题: 我们登录成功…

Django 定义模型执行迁移

1,创建应用 Test/app8 python manage.py startapp app8 2,注册应用 Test/Test/settings.py 3,配置路由 Test/Test/urls.py from django.contrib import admin from django.urls import path, includeurlpatterns [path(app8/, include(a…

SCI一区TOP|徒步优化算法(HOA)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年,SO Oladejo受到徒步旅行启发,提出了徒步优化算法(Hiking Optimization Algorithm, HOA)。 2.算法原理 2.1算法思想 HOA灵感来自于…

机器人控制系列教程之Delta机器人动力学分析

动力学简介 机器人动力学分析是已知各运动构件的尺寸参数和惯性参数的情况下,求解末端运动状态与主驱动力矩之间的函数关系。 意义:对并联机器人动力学分析的意义体现在: 为伺服电机的选型提供理论依据;获得动力学参数为目标函数的最优问题做性能评价指标;为高精度控制提…

windows@资源管理器中的地址栏@访问共享文件夹的各种方法@管理共享文件夹

文章目录 资源管理器中的地址栏可以访问什么访问共享文件夹👺UNC路径资源管理器打开共享文件夹纯命令行方式访问共享文件夹 共享文件夹相关操作查看所有已经共享的文件夹👺停止某个文件的共享 共享文件夹的访问控制补充匿名访问问题😊强制启用…

VSCode 自动调整格式失效了 ESLint

ESLint【最新注意2.4.4版本有问题,需退回2.4.2版本就恢复正常了】 参考:vscode自动格式化失效_vscode保存自动格式化失效-CSDN博客

C++内存管理(候捷)第一讲 笔记

内存分配的每一层面 applications可以调用STL,里面会有allocator进行内存分配;也可以使用C 基本工具primitives,比如new, new[], new(), ::operator new();还可以使用更底层的malloc和free分配和释放内存。最底层的是系统调用&…

Android adb logcat日志过滤输出

Android adb logcat日志过滤输出 adb logcat 输出所有Android设备上的日志。 adb logcat *:Error 过滤输出日志级别只为Error的日志。 过滤某些标签或tag,依次执行: adb shell logcat grep | "你的标签或tag" Android Studio level过滤查看各个等级的日志…

数据列表组件-报表

当数据在后端接口查询到&#xff0c;需要在页面展示出来&#xff0c;如果项目有很多report &#xff0c;可以把列表做一个组件 效果如下&#xff1a; js代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title&g…

大白菜U盘启动工具

大白菜如何u盘启动进winpe装系统大白菜是一款非常实用的U盘启动盘制作工具&#xff0c;可以帮助用户快速地将U盘制作成启动盘&#xff0c;从而方便地进行系统安装、维护和修复等操作。官方网站&#xff1a; 大白菜u盘启动盘制作工具_大白菜u盘装系统_大白菜pe_大白菜官网-首页…

顶级10大AI测试工具

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Elasticsearch集群部署(下)

目录 上篇&#xff1a;Elasticsearch集群部署&#xff08;上&#xff09;-CSDN博客 七. Filebeat 部署 八. 部署Kafka 九. 集群测试 链接&#xff1a;https://pan.baidu.com/s/1AFXSmDdY5xBb7g35ipKoaw?pwdfa9m 提取码&#xff1a;fa9m 七. Filebeat 部署 为什么用 F…