关于SpringBoot中出现的循环依赖问题
- 环境:
SpringBoot2.7.8
- 背景:
在增加出库订单时需要对物品表的的数量进行修改
因此我在OutboundController中创建了几个公共方法,并将其注入到Spring中,结果给我报了这一串错误。
Description:
The dependencies of some of the beans in the application context form a cycle:
┌──->──┐
| getGoodsNumber defined in class path resource [com/QRproject/project/system/controller/GoodsController.class]
└──<-──┘
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.- 代码:
- 在OutboundController中创建了个公共方法,并将其注入到Spring中:(以下方法均未开启事务支持)
1 @RestController
2 @RequestMapping("/goods")
3 public class GoodsController {
4
5 @Autowired
6 private IGoodsService goodsService;
7 @Bean
8 public boolean deleteGoodsNum(Integer goodsId,Integer goodsNum){
9 Goods goods = goodsService.getById(goodsId);
10 goods.setGoodsNumber(goods.getGoodsNumber()-goodsNum);
11 goodsService.updateById(goods);
12 return true;
13 }
14 }- 接着我在OutboundController中注入GoodsController
1 public class OutboundController {
2 @Autowired
3 private IOutboundService outboundService;
4 @Autowired
5 private GoodsController goodsController;
6
7 @PostMapping
8 public Result<?> addOutbound(@RequestBody Outbound outbound){
9 goodsController.deleteGoodsNum(outbound.getGoodsId(),outbound.getGoodsNumber());
10 LocalDateTime localDateTime = LocalDateTime.now();
11 outbound.setOutTime(localDateTime);
12 outboundService.save(outbound);
13 return Result.success("增加出库订单成功");
14 }
15 }- 运行完便报错了
- 解决:
引发的原因是因为两个类进行了相互的调用,触发了spring的循环依赖检查
SpringBoot中2.6后开启了循环依赖检查,并默认关闭了循环依赖支持 可以在配置中开启
诚然造成循环依赖是一个bad habit 我们需要另外一种解决方法:
- 1.试着把goodsServices注入过来结果还是一样
- 2.使用@Lazy 懒加载注解 还是不行
1 @Lazy
2 @Autowired
3 private GoodsController goodsController;- 3.试了一下在配置中开启循环依赖支持结果也不行。。
1 spring:
2 main:
3 allow-circular-references: true- 4.最后只好老实敲代码进行解耦了
- goodsPublicService
1 @Service
2 public interface goodsPublicService extends IService<Goods>{
3 void deleteGoodsNum(Integer goodsId, Integer goodsNumber);
4 }- goodsPublicServiceImpl:
1 @Service
2 public class goodsPublicServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements goodsPublicService {
3 public void deleteGoodsNum(Integer goodsId,Integer goodsNum){
4 Goods goods = this.baseMapper.selectById(goodsId);
5 goods.setGoodsNumber(goods.getGoodsNumber()-goodsNum);
6 this.baseMapper.updateById(goods);
7 }
8 }- OutboundController:
1 @PostMapping
2 public Result<?> addOutbound(@RequestBody Outbound outbound){
3 goodsPublicService.deleteGoodsNum(outbound.getGoodsId(),outbound.getOutNum());
4 LocalDateTime localDateTime = LocalDateTime.now();
5 outbound.setOutNum(outbound.getOutNum());
6 outbound.setOutTime(localDateTime);
7 outboundService.save(outbound);
8 return Result.success("增加出库订单成功");
9
- 成功运行!
关于SpringBoot中出现的循环依赖问题的更多相关文章
- SpringBoot项目意外出现 循环依赖和注入的对象意外是Null的问题 Requested bean is currently in creation: Is there an unresolvable circular reference? 或 nested exception is java.lang.NullPointerException
1.Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ...
- 在.NET Core中遭遇循环依赖问题"A circular dependency was detected"
今天在将一个项目迁移至ASP.NET Core的过程中遭遇一个循环依赖问题,错误信息如下: A circular dependency was detected for the service of ...
- SpringBoot中实现依赖注入功能
本文转载自:https://blog.csdn.net/linzhiqiang0316/article/details/52639888 今天给大家介绍一下SpringBoot中是如何实现依赖注入的功 ...
- 面试必杀技,讲一讲Spring中的循环依赖
本系列文章: 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configu ...
- 面试阿里,腾讯,字节跳动90%都会被问到的Spring中的循环依赖
前言 Spring中的循环依赖一直是Spring中一个很重要的话题,一方面是因为源码中为了解决循环依赖做了很多处理,另外一方面是因为面试的时候,如果问到Spring中比较高阶的问题,那么循环依赖必定逃 ...
- 【Spring】Spring中的循环依赖及解决
什么是循环依赖? 就是A对象依赖了B对象,B对象依赖了A对象. 比如: // A依赖了B class A{ public B b; } // B依赖了A class B{ public A a; } ...
- Spring基础系列-Spring事务不生效的问题与循环依赖问题
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9476550.html 一.提出问题 不知道你是否遇到过这样的情况,在ssm框架中开发we ...
- 从源码层面深度剖析Spring循环依赖
作者:郭艳红 以下举例皆针对单例模式讨论 图解参考 https://www.processon.com/view/link/60e3b0ae0e3e74200e2478ce 1.Spring 如何创建 ...
- spring循环依赖问题分析
新搞了一个单点登录的项目,用的cas,要把源码的cas-webapp改造成适合我们业务场景的项目,于是新加了一些spring的配置文件. 但是在项目启动时报错了,错误日志如下: 一月 , :: 下午 ...
- 解析spring循环依赖策略
循环依赖 所谓循环依赖就是多个Bean之间依赖关系形成一个闭环,例如A->B->C->...->A 这种情况,当然,最简单的循环依赖就是2个Bean之间互相依赖:A->B ...
随机推荐
- Android 调试桥 (adb) 使用教程/示例
sidebar: auto Android 调试桥 (adb) Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信.adb 命令可用于执行各种设备操作,例如安装和调试 ...
- PC首页资源加载速度由8s降到2s的优化实践
随着需求的不断开发,前端项目不断膨胀,业务提出:你们的首页加载也太慢啦,我都需要7.8秒才能看到内容,于是乎主管就让我联合后端开启优化专项,目标是3s内展示完全首页的内容. 性能指标 开启优化时,我们 ...
- 开源.NetCore通用工具库Xmtool使用连载 - 扩展动态对象篇
[Github源码] <上一篇> 介绍了Xmtool工具库中的图形验证码类库,今天我们继续为大家介绍其中的扩展动态对象类库. 扩展动态对象是整个工具库中最重要的一个设计.在软件开发过程中, ...
- Spring框架中的设计模式(重点学习!!!)
Spring中的设计模式 Spring框架中用到的设计模式有很多,以下是一些常见的设计模式: 依赖注入(DI)和控制反转(IoC):这是Spring框架最核心的设计模式,它允许开发人员将对象之间的依赖 ...
- gitbook在线记事本
https://app.gitbook.com/ About this template: An Internal Wiki to lay out everything anyone needs to ...
- mysqli操作
1.使用mysqli_connect()函数,语法如下: mysqli 对象名=mysqli_connect(数据库服务名,用户名,密码,数据库名) 例:$conn=mysqli_connect('l ...
- 【Java集合】单列集合Collection常用方法详解
嗨~ 今天的你过得还好吗? 路途漫漫终有一归, 幸与不幸都有尽头. 在上篇文章中,我们简单介绍了下Java 集合家族中的成员,那么本篇文章,我们就来看看 Java在单列集合中,为我们提供的一些方法,以 ...
- 一个Docker仓库问题的思考
近期项目有云上部署要求,产品要打包成docker镜像.之前产品已经发布过docker版本本次只需要需要更新下,于是交代组内另外一个同学更新下镜像,想着应该很简单: 中间经过熟悉docker知识点搭建环 ...
- Nebula Graph开源分布式图数据库,万亿级数据,毫秒级延时
推荐一个分布式图数据库Nebula Graph,万亿级数据,毫秒级延时 什么是Nebula Graph Nebula Graph 是一款开源的.分布式的.易扩展的原生图数据库,能够承载包含数千亿个点和 ...
- 【pwn】[SDCTF 2022]Horoscope--栈溢出,atoi函数绕过
checksec检查一下,发现只开了nx,然后ida打开直接看主函数 发现fgets函数往s里面读入320个字节的数据,此处可造成溢出,再看看test和debug函数 void debug(){ t ...