• 痛快SpringBoot终于禁掉了循环依赖


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

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

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

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

    验证代码小片段

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

    CircularDependencyA.java

    1. @Component
    2. @RequiredArgsConstructor
    3. public class CircularDependencyA {
    4.     private final CircularDependencyB circB;
    5. }

    CircularDependencyB.java

    1. @Component
    2. @RequiredArgsConstructor
    3. public class CircularDependencyB {
    4.     private final CircularDependencyA circA;
    5. }
    6. 复制代码

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

    报错如下:

    1. The dependencies of some of the beans in the application context form a cycle:
    2. ┌─────┐
    3. |  circularDependencyA defined in file [cir/CircularDependencyA.class]
    4. ↑     ↓
    5. |  circularDependencyB defined in file [cir/CircularDependencyB.class]
    6. └─────┘
    7. Action:
    8. 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.
    9. 复制代码

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

    1. spring.main.allow-circular-references=true
    2. 复制代码

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

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

    做对的事

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

    1. AbstractAutowireCapableBeanFactory#allowCircularReferences
    2. /** Whether to automatically try to resolve circular references between beans. */
    3. private boolean allowCircularReferences = true;
    4. 复制代码

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

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

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

  • 相关阅读:
    02_Docker
    Nacos服务调用(基于Openfeign)
    从阿里出发看微服务发展!P8架构师手打800页微服务深度解析笔记
    【二】【SQL】去重表数据及分组聚合查询
    Maven详解
    Vue 组件的全局注册与组件的jsx实现方法
    实战|基于YOLOv10与MobileSAM实现目标检测与分割【附完整源码】
    Day131.MySQL高级:索引、Explain索引分析、索引优化 | 失效情况
    Linux docker 搭建Redis主从复制集群、新增(扩容)主/从节点、删除(缩容)主/从节点
    Ubuntu 20.04上docker安装RabbitMQ并确保可以访问RabbitMQ的管理界面
  • 原文地址:https://blog.csdn.net/m0_68850571/article/details/124967364