乐趣区

关于java:SpringBoot26x默认禁用循环依赖后的应对策略

一、序言

SpringBoot 2.6.x不举荐应用循环依赖,这是一个好消息,SpringBoot 从底层逐步疏导开发者书写标准的代码,同时也是个难过的音讯,循环依赖的利用场景切实是太宽泛了。

如果从低版本升级到2.6.x,那么很大概率遇到的第一个问题便是循环依赖问题。

二、问题还原

1、代码阐明

上面格调的代码比拟广泛:两个类都有调用对方办法的需要,因而很容易写成循环援用。

@Service
public class TbDeptServiceImpl extends ServiceImpl<TbDeptMapper, TbDept> implements ITbDeptService {
    
    @Autowired
    private ITbStaffService staffService;
}
@Service
public class TbStaffServiceImpl extends ServiceImpl<TbStaffMapper, TbStaff> implements ITbStaffService {
    @Autowired
    private ITbDeptService deptService;
}
2、谬误示例
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.
Despite circular references being allowed, the dependency cycle between beans could not be broken. Update your application to remove the dependency cycle.

三、问题解决

1、粗犷解决

最简略的形式是在全局配置文件中容许循环援用存在,此属性默认值为false,显示申明为true,可回避我的项目启动时控制台循环援用异样。

spring:
  main:
    allow-circular-references: true
2、优雅解决

Spring 官网默认禁止应用循环依赖,只管留有可选配置,容许开发者持续应用循环依赖。

Spring 官网的初心是不心愿开发者编写循环依赖的代码,也就是说将来的某个版本可能强制不得应用循环依赖,因而逐步在新我的项目中打消循环依赖是不得不面对的问题。

应用办法的返回值获取实例对象,替换通过成员变量注入实例对象。

@Service
public class TbDeptServiceImpl extends ServiceImpl<TbDeptMapper, TbDept> implements ITbDeptService {
    /**
     * 应用办法返回实例对象,替换成员变量注入
     * @return ITbStaffService
     */
    public ITbStaffService getStaffService(){return SpringUtils.getBean(ITbStaffService.class);
    }
}
@Service
public class TbStaffServiceImpl extends ServiceImpl<TbStaffMapper, TbStaff> implements ITbStaffService {
    /**
     * 应用办法返回实例对象,替换成员变量注入
     * @return ITbStaffService
     */
    public ITbDeptService getDeptService(){return SpringUtils.getBean(ITbDeptService.class);
    }
}

其中须要应用如下依赖,此依赖是笔者抽离进去的 公共依赖,可跨我的项目应用。

<dependency>
    <groupId>xin.altitude.cms.common</groupId>
    <artifactId>ucode-cms-common</artifactId>
    <version>1.3.4</version>
</dependency>

如果找不到此依赖,很大可能是阿里云 Maven 仓库尚未同步,在我的项目中强制应用 Maven 地方仓库即可。

<repositories>
    <repository>
        <id>public</id>
        <name>maven nexus</name>
        <url>https://repo1.maven.org/maven2/</url>
        <snapshots>
            <updatePolicy>always</updatePolicy>
        </snapshots>
    </repository>
</repositories>

四、小结

Spring 生态作为宽泛应用的框架,俨然成为 Java 企业级利用支流规范,其渺小的变动对整合生态带来不可估量的影响。从跟随者转化为引导者,果决禁止循环依赖问题,体现的是作为引导者的担当。

循环援用应用习惯了,初步看起来代码没故障,认真想想是不合理的设计。循环依赖的间接体现是 你中有我,我中有你,从对象的设计上令人费解。

最为开发者时刻关注底层框架的变动,将会在应用层收益。这里所说的底层框架是指 JDK、Spring 生态、Apache、出名大厂开源并宽泛被利用的框架,比方 guava 等。


喜爱本文点个♥️赞♥️反对一下,关注我下期再见,相干源码在 GitHub,视频解说在 B 站,本文珍藏在专题博客。

退出移动版