首页 > 其他分享 >关于SpringBoot中出现的循环依赖问题

关于SpringBoot中出现的循环依赖问题

时间:2023-08-25 21:11:33浏览次数:61  
标签:依赖 outbound SpringBoot goodsId 循环 goods Integer public OutboundController

  • 环境:

    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 
  • 成功运行!

标签:依赖,outbound,SpringBoot,goodsId,循环,goods,Integer,public,OutboundController
From: https://www.cnblogs.com/CooperCode/p/17657952.html

相关文章

  • 原来你是这样的SpringBoot--Async异步任务
    本节我们一起学习一下SpringBoot中的异步调用,主要用于优化耗时较长的操作,提高系统性能和吞吐量。一、新建项目,启动异步调用首先给启动类增加注解@EnableAsync,支持异步调用@EnableAsync@SpringBootApplicationpublicclassCathySpringbootDemoApplication{publicstat......
  • Python——for循环
    字符串是可迭代的for循环:  for变量in可迭代的东西:    代码for循环把可迭代的东西中的每一项内容拿出来.挨个的赋值给变量.每一次赋值都要执行一次循环体(代码)s="你好啊,我叫赛利亚"forcins:print("取值:",c)输出结果是列表、元组、字典......
  • Python的循环语句2——break和continue
    whileTrue:content=input("请输入你要发送的内容(q结束):")print("发送内容:",content)这样的代码会无限循环因此我们需要使用break字段让循环立即停止添加一个判断,如果输入q,即可结束循环跳出whileTrue:content=input("请输入你要发送的内容(q结束):")......
  • springboot结合baomidou dynamic-datasource组件实现多数据源
    当系统数据量过大,系统性能问题逐渐浮出水面。使用主从模式,不失是一个较好的选择。即业务在主库执行,不影响业务的查询考虑走从库。这时,程序需要动态多数据源配置。......
  • SpringBoot配置加载方式
    在开发中,我们经常会和配置打交道,SpringBoot为了方便配置的的管理和加载,提供了灵活的配置文件加载机制。它允许从多个来源中加载应用配置信息。如系统默认配置、外部配置文件、环境变量、命令行参数、数据库、配置中心等。下面介绍几种常见的属性来源配置方式。命令行参数Spring......
  • springboot整合redis回滚
    1:添加依赖2:yml中配置连接,如:host,password,port3:@autowired注解注入Redistemplate调用方法生成对象 为了方便公司开发,一般会对数据进行序列化存储,这时需要创建配置类进行全局设置packagecom.example.config;importcom.fasterxml.jackson.annotation.JsonAutoDetect;importco......
  • 无涯教程-Python - 循环语句
    通常,语句是按顺序执行的:函数中的第一个语句首先执行,然后第二个执行,依此类推。在某些情况下,您需要多次执行一个代码块。循环语句使无涯教程可以多次执行一个语句或一组语句。下图说明了循环语句-Python编程语言提供了以下类型的循环来处理循环需求。Sr.No.LoopType&描述1......
  • java中 while循环和 do while循环的区别| while与do while的区别
    1、while循环:表示如果条件满足,程序一直循环执行,直到条件不满足为止。所以while循环的条件一般通过变量来进行控制,在循环体内对变量值做相应改变,以便在适当的时候退出,避免陷入死循环。inti=1;while(i<5){//业务逻辑if(i%2>0){System.out.print(“i是偶数”)}else{Sys......
  • 基于springboot城镇保障性住房管理系统
    随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了城镇保障性住房管理系统的开发全过程。通过分析城镇保障性住房管理系统管理的不足,创建了一个计算机管理城镇保障性住房管理系统的方案。文章介绍了城镇保障性住房管理系统的系统分析部......
  • 基于SpringBoot的企业资产管理系统
    本企业资产管理系统预期设计的主要功能有用户信息管理、资产分类管理、资产信息管理、资产借出管理、资产归还管理、资产维修管理等模块。通过用户信息管理功能模块,相关使用者可以对用户信息进行管理,比如可以选择修改、删除某位用户,也可以选择增加、查询用户信息。通过资产分类管理......