关于SpringBoot禁止循环依赖解说

 更新时间:2022年05月16日 09:57:55   作者:​ 小姐姐味道   ​  
这篇文章主要介绍了关于SpringBoot禁止循环依赖解说,Spring的Bean管理,文章围绕主题展开详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下

前言:

Spring的Bean管理,一直是整个体系中津津乐道的东西。尤其是Bean的循环依赖,更是很多面试官最喜欢考察的2B知识点之一。

但事实上,项目中存在Bean的循环依赖,是代码质量低下的表现。多数人寄希望于框架层来给擦屁股,造成了整个代码的设计越来越糟,最后用一些奇技淫巧来填补犯下的错误。

还好,SpringBoot终于受不了这种滥用,默认把循环依赖给禁用了!

从2.6版本开始,如果你的项目里还存在循环依赖,SpringBoot将拒绝启动!

验证代码小片段:

为了验证这个功能,我们只需要两段小代码。

CircularDependencyA.java

@Component
@RequiredArgsConstructor
public class CircularDependencyA {
    private final CircularDependencyB circB;
}

CircularDependencyB.java

@Component
@RequiredArgsConstructor
public class CircularDependencyB {
    private final CircularDependencyA circA;
}

RequiredArgsConstructor注解,是lombok包里面的,用来实现简单的构造器注入。不出所料,当我们启动代码的时候,报错了~~

报错如下:

The dependencies of some of the beans in the application context form a cycle:
┌─────┐
|  circularDependencyA defined in file [cir/CircularDependencyA.class]
↑     ↓
|  circularDependencyB defined in file [cir/CircularDependencyB.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.

当然,有些鸟人已经玩大了,循环依赖到处都是,改代码变的越来越不现实。那你还可以通过在yaml里配置参数来临时开启循环依赖。

spring.main.allow-circular-references=true

看来SpringBoot对恶势力的容忍能力还是不够坚决啊!

绕过SpringBoot这个拦截的方法不止一种,比如使用@Lazy注解进行延迟初始化。但这些都是治标不治本,辜负了SpringBoot的一片苦心。

做对的事:

其实,我们一直把代码往下找下去,会发现这个开关,其实是Spring的功能。

AbstractAutowireCapableBeanFactory#allowCircularReferences
/** Whether to automatically try to resolve circular references between beans. */
private boolean allowCircularReferences = true;

很长一段时间,SpringBoot这个值都是默认为true的。但这种纵容造成了大批低质量的代码产生,以至于新员工一直在给老员工擦屁股。

把这个值默认设置为false,是坚持做对的事情。起码,在工程师编写出质量不高的代码时,能够知道他自己在做什么,而不是把隐患一步步的推迟,任代码腐败。

不得不为SpringBoot点个赞。真棒!

到此这篇关于关于SpringBoot禁止循环依赖解说的文章就介绍到这了,更多相关SpringBoot循环依赖内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • mybatis高级映射一对多查询实现代码

    mybatis高级映射一对多查询实现代码

    本篇文章主要介绍了mybatis高级映射一对多查询实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • spring6注解式开发示例详解

    spring6注解式开发示例详解

    文章介绍了Spring框架中使用注解进行开发的机制,包括如何定义和使用自定义注解,通过反射机制读取注解,以及如何根据注解进行组件扫描和bean的实例化,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • Java多线程中Lock的使用小结

    Java多线程中Lock的使用小结

    jdk1.5 以后,提供了各种锁,本文主要介绍了Java多线程中Lock的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Java程序快速合并多个Word(docx)文档

    Java程序快速合并多个Word(docx)文档

    这篇文章主要为大家介绍了如何使用Java程序快速合并多个Word(docx)文档实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Java Vector和ArrayList的异同分析及实例讲解

    Java Vector和ArrayList的异同分析及实例讲解

    在本篇文章里小编给大家整理的是一篇关于Java Vector和ArrayList的异同分析及实例讲解内容,有兴趣的朋友们可以学习参考下。
    2021-01-01
  • MyBatis-plus处理存储json数据过程

    MyBatis-plus处理存储json数据过程

    文章介绍MyBatis-Plus 3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承FastjsonTypeHandler并重写parse方法,同时需明确指定类类型及XML中的resultMap以解决转换问题
    2025-08-08
  • MacOS如何安装配置多个JDK并切换使用详解

    MacOS如何安装配置多个JDK并切换使用详解

    这篇文章主要介绍了如何在MacOS上安装和配置多个JDK版本,通过配置环境变量来实现,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • Java上转型和下转型对象

    Java上转型和下转型对象

    这篇文章给大家讲述了Java上转型和下转型对象的详细用法以及相关的代码分享,有兴趣的朋友可以学习下。
    2018-03-03
  • 利用栈使用简易计算器(Java实现)

    利用栈使用简易计算器(Java实现)

    这篇文章主要为大家详细介绍了Java利用栈实现简易计算器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 轻松了解java中Caffeine高性能缓存库

    轻松了解java中Caffeine高性能缓存库

    本文我们将学习了解到用于Java的高性能缓存库Caffeine,其使用Window TinyLfu清理策略,提供最佳的命中率
    2021-08-08

最新评论