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

这篇具有很好参考价值的文章主要介绍了关于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 我们需要另外一种解决方法:文章来源地址https://www.toymoban.com/news/detail-671439.html

    • 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中出现的循环依赖问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot 循环依赖,如何解决?

    循环依赖是指在Spring Boot 应用程序中,两个或多个类之间存在彼此依赖的情况,形成一个循环依赖链。 在这种情况下,当一个类在初始化时需要另一个类的实例,而另一个类又需要第一个类的实例时,就会出现循环依赖问题。这会导致应用程序无法正确地初始化和运行,因为

    2024年02月01日
    浏览(42)
  • springboot循环依赖

    2024年02月10日
    浏览(53)
  • SpringBoot 三级缓存解决循环依赖源码分析

    在 SpringBoot 框架中,如果只存在两级缓存,那么当发生循环依赖的时候可能存在异常的对象创建流程如下图所示: 创建 A 的空白对象 a1 解析填充 A 对象的属性,发现依赖的 B 对象未创建,则触发 B 对象创建 创建 B 对象过程中,填充对象属性时发现依赖 A 对象,此时从缓存中

    2024年02月11日
    浏览(50)
  • SpringBoot 循环依赖的症状和解决方案

    循环依赖是指在Spring Boot 应用程序中,两个或多个类之间存在彼此依赖的情况,形成一个循环依赖链。 在这种情况下,当一个类在初始化时需要另一个类的实例,而另一个类又需要第一个类的实例时,就会出现循环依赖问题。这会导致应用程序无法正确地初始化和运行,因为

    2024年02月09日
    浏览(42)
  • Spring解决循环依赖问题

    例如,就是A对象依赖了B对象,B对象依赖了A对象。(下面的代码属于 属性的循环依赖 ,也就是初始化阶段的循环依赖,区别与底下 构造器的循环依赖 ) 问题来了: A Bean创建 —— 依赖了 B 属性 ——  触发 B Bean创建 ——  B 依赖了 A 属性 ——  需要 A Bean(但A Bean还在创建

    2024年02月12日
    浏览(45)
  • Spring如何解决循环依赖问题

    循环依赖问题在Spring中主要有三种情况: (1)通过构造方法进行依赖注入时产生的循环依赖问题。 (2)通过setter方法进行依赖注入且是在多例(原型)模式下产生的循环依赖问题。 (3)通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题。 在Spring中,只有第

    2024年02月06日
    浏览(46)
  • Spring怎么解决循环依赖问题?

    循环依赖是指 一个或多个对象之间存在直接或间接的依赖关系,这种依赖关系构成一个环形调用 , 举个例子 : A 依赖B , B依赖C , C依赖A , 这样就形成了循环依赖;   ①构造器的循环依赖:这种依赖spring是处理不了的,直接拋出BeanCurrentlyInCreationException异常。 ②单例模式下的se

    2024年02月08日
    浏览(55)
  • @Async引发的循环依赖问题

    这个以前分析过了,但是再看的时候感觉写的太乱了(流水账),这个是精简版本。 先上bug,众所周知,spring通过实例化和属性注入分开解决了循环依赖,理论上也不会有问题。但是意外就那么来了,经过排查是 @Async 导致,报错如下所示。 简单的说: BeanA 为了解决循环依赖,

    2024年02月11日
    浏览(39)
  • 生产项目中基于springboot项目解决循环依赖的三种方式

    在生产项目中,可以使用Spring Boot框架来快速开发Spring应用程序。Spring Boot提供了一种方便的方式来创建独立的,基于Spring的应用程序,并且有着高度的自动化配置和开箱即用的特性。 可以使用@Lazy注解来控制Bean的延迟初始化,同时可以使用AOP切面编程来解决循环依赖问题。

    2024年02月11日
    浏览(53)
  • Spring 是如何解决循环依赖问题的?

    提示:这里简述项目相关背景: 例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大)         我们都知道,如果在代码中,将 两个或多个 Bean 互相之间持有对方的引用 就会发生循环依赖。循环的依赖将会导致注入死循环,这

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包