Spring的Bean管理一直是全系统津津乐道的话题。尤其是Bean的循环依赖,是很多面试官最喜欢考察的2B知识点之一。但实际上,项目中存在bean的循环依赖,是代码质量低下的表现。大部分人都是靠框架层来擦屁股,导致整个代码的设计越来越差,最后用一些技巧来弥补犯下的错误。好在SpringBoot终于受不了这种虐了,循环依赖默认是关闭的!从2.6版本开始,如果你的项目中仍然存在循环依赖,SpringBoot将拒绝启动!验证代码片段为了验证这个功能,我们只需要两小段代码。CircularDependencyA.java@Component@RequiredArgsConstructorpublicclassCircularDependencyA{privatefinalCircularDependencyBcircB;}CircularDependencyB.java@Component@RequiredArgsConstructorpublicclassCircularDependencyB{privatefinalCircularDependencyAcircA;}RequiredArgsConstructor注解,是lombok包里面的,用来的实现构造。果不其然,当我们启动代码的时候,报错了~~报错如下:applicationcontext中部分bean的依赖形成了一个循环:┌──────┐|circularDependencyA在文件[cir/CircularDependencyA.类]↑↓|文件[cir/CircularDependencyB.class]中定义的circularDependencyB└────────┘Action:不鼓励依赖循环引用,默认情况下它们是被禁止的。更新您的应用程序以删除bean之间的依赖循环。作为最后的手段,可以通过将spring.main.allow-circular-references设置为true来自动打破循环。当然,有些鸟人已经玩大了,循环依赖无处不在,代码越改越不现实。那么你也可以通过在yaml中配置参数来临时启用循环依赖。spring.main.allow-circular-references=true看来SpringBoot对黑恶势力的容忍度还不够坚定!绕过SpringBoot拦截的方法不止一种,比如使用@Lazy注解进行延迟初始化。但这些都是治标不治本,辜负了SpringBoot的苦心。做正确的事其实我们一直往下看代码,会发现这个开关其实是Spring的一个功能。AbstractAutowireCapableBeanFactory#allowCircularReferences/**是否自动尝试解决bean之间的循环引用。*/privatebooleanallowCircularReferences=true;长期以来,SpringBoot的值默认为true。但这种纵容导致了大量的低质量代码,以至于新员工一直在为老员工埋坑。默认情况下将此值设置为false是正确的做法。至少,当一个工程师写出低质量的代码时,他可以知道自己在做什么,而不是一步步拖延隐患,让代码腐败。不得不给SpringBoot竖起大拇指。惊人的!作者简介:品味小姐姐(xjjdog),一个不允许程序员走弯路的公众号。专注于基础架构和Linux。十年架构,每天百亿流量,与你探讨高并发世界,给你不一样的滋味。
