当前位置: 首页 > 后端技术 > Java

SpringBoot2.6.x默认禁用循环依赖

时间:2023-04-01 21:59:15 Java

1。序言SpringBoot2.6.x不推荐使用循环依赖。这是个好消息。SpringBoot逐渐引导开发者从底层开始编写规范的代码,也是一个悲催的消息,循环依赖的应用场景实在是太广阔了。如果从低版本升级到2.6.x,第一个遇到的问题很可能就是循环依赖问题。二、问题恢复1、代码说明下面这种风格的代码比较常见:两个类都有调用对方方法的需求,所以很容易写出循环引用。@ServicepublicclassTbDeptServiceImplextendsServiceImplimplementsITbDeptService{@AutowiredprivateITbStaffServicestaffService;}@ServicepublicclassTbStaffServiceImplextendsServiceImplimplementsITbStaffService{@AutowiredprivateITbDeptServicedeptService;}2、错误提示示例依赖循环引用不鼓励,默认情况下禁止使用它们。更新您的应用程序以删除bean之间的依赖循环。作为最后的手段,可以通过将spring.main.allow-circular-references设置为true来自动打破循环。尽管允许循环引用,但无法打破bean之间的依赖循环。更新您的应用程序以删除依赖循环。三、问题解决1、解决问题最简单的方法就是在全局配置文件中允许存在循环引用。该属性的默认值为false,则显示语句为true,可以避免项目启动时控制台循环引用异常。spring:main:allow-circular-references:true2.优雅的解决方案Spring官方默认禁止使用循环依赖,尽管有可选的配置允许开发者继续使用循环依赖。Spring官方的初衷是希望开发者不希望开发者写出循环依赖的代码,也就是说未来某个版本可能会强制使用循环依赖,所以在新项目中逐步消除循环依赖是一个不得不解决的问题面临。使用方法的返回值获取实例对象,而不是通过成员变量注入实例对象。@ServicepublicclassTbDeptServiceImplextendsServiceImplimplementsITbDeptService{/***使用方法返回实例对象,替换成员变量注入*@returnITbStaffService*/publicITbStaffServicegetStaffService(){returnSpringUtils.getBean(ITbStaffService.class);}}@ServicepublicclassTbStaffServiceImplextendsServiceImplimplementsITbStaffService{/***使用方法返回实例对象,替换成员变量注入*@returnITbStaffService*/publicITbDeptServicegetDeptService(){returnSpringUtils.getBean(ITbDeptService.班级);其中,需要用到如下依赖。该依赖是作者提取的公共依赖,可以跨项目使用。xin.altitude.cms.commonucode-cms-common1.3.4如果找不到这个依赖,很有可能阿里云Maven仓库没有同步,项目中可以强行使用Maven中央仓库。publicmavennexushttps://repo1.maven.org/maven2/always四、总结Spring生态作为一个被广泛使用的框架,已经成为Java企业级应用的主流标准,它的微小变化对集成的影响不可估量生态。从跟随者转变为领导者,坚决杜绝循环依赖问题,体现了作为领导者的担当。我习惯于使用循环引用。乍一看似乎代码没问题。仔细想想是不合理的设计。循环依赖的直接表现就是你有我,我有你,从对象的设计上就很费解。大多数开发人员时刻关注底层框架的变化,并会从应用层受益。这里所说的底层框架是指JDK、Spring生态、Apache、知名开源和广泛使用的框架,如guava等,如果喜欢本文,请点??赞??支持一下。有需要的可以微信dream4s联系我。相关源码在GitHub,视频讲解在B站,本文收集于博客世界。