SpringBoot3.x循环依赖问题解决方案

 更新时间:2023年06月06日 15:28:58   作者:陌路  
这篇文章主要介绍了SpringBoot3.x循环依赖的相关知识,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

问题说明

SpringBoot3.x版本已经发布,从SpringBoot2.6.x后就做了很多的改变。

用过SpringBoot2.7.5~x版本的伙伴应该会发现,SpringBoot项目中如果存在循环依赖关系,则在启动项目的时候会出现异常错误信息,提示内容大致为:项目中存在循环依赖,项目无法正常启动运行。

SpringBoot2.7.5~x版本以后至SpringBoot3.x都存在这个问题,Spring已经摒弃循环依赖的问题,需要开发人员自行解决,或在开发过程中尽量避免循环依赖的出现。

对于旧版本项目升级的来说,这将会是一件很棘手的问题,所有的存在循环依赖关系的代码都需要重新调整,况且一不小心就会代码崩溃无法运行。

解决方案

第一种、开启循环依赖(不推荐)

Spring默认已经不在支持循环依赖,在配置文件中重新开启循环依赖支持

spring:
    main:
        allow-circular-references:true #允许循环引用

第二种、懒加载

@Lazy:配合使用该注解可以解决循环依赖问题(在需要注入Bean的地方加上该注解)

@Lazy // 使用懒加载
@Autowired
private OneService oneService;

第三种、控制反转

@Service
@RequiredArgsConstructor // 该注解的使用在下面会有介绍和说明
public class OneServiceImpl implements OneService {
    private final ConfigurableListableBeanFactory beanFactory;
    //代替循环依赖
    public TwoService getTwoService(){
        return beanFactory.getBean(TwoService.class);
    }
}

使用getTwoService() 直接从bean工厂里面去拿对应的Bean来使用

@Service
@RequiredArgsConstructor // 该注解的使用在下面会有介绍和说明
public class TwoServiceImpl implements TwoService {
    private final ConfigurableListableBeanFactory beanFactory;
    //代替循环依赖
    public OneService getOneService(){
        return beanFactory.getBean(OneService.class);
    }
}

以上代码中,OneService依赖于TwoService,而TwoService也依赖于OneService,从而产生循环依赖
解决:每次使用的时候就去Bean工厂里去获取,这样就不存在循环依赖了

@RequiredArgsConstructor使用说明

@RequiredArgsConstructor:该注解是由Lombok提供,可以解决掉大量重复的@Autowired代码
注意:使用@RequiredArgsConstructor时,需要使用final关键字
写在类上可以代替@Autowired注解,需要注意的是在注入时需要用final定义,或者使用@notnull注解

@RestController
@RequiredArgsConstructor // 代替@Autowired注解
@RequestMapping("/api/v1/one")
public class OneController{
	private final OneService oneService; // 需要final关键字
	private final TwoService twoService; // 需要final关键字
	@GetMapping("{id}")
	public ResultVo<String> getDetails(@PathVariable("id") Long id){
		return ResultVo.ok(oneService.getDetailsById(id));
	}
}

注意点:

1、必须声明的变量为final。
2、根据构造器注入的,相当于容器调用带有一组带有参数的类构造函数时,基于构造函数的 DI 就完成了,其中每个参数代表一个对其他类的依赖。基于构造方法为属性赋值,容器通过调用类的构造方法将其进行依赖注入。
3、当需要注入Bean的时候可以直接在类名称上使用@RequiredArgsConstructor,从而代替了大量的@Autowrited注解。

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

相关文章

  • springboot 按月分表的实现方式

    springboot 按月分表的实现方式

    本文主要介绍了springboot 按月分表的实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • JavaWeb中上传和下载文件实例代码

    JavaWeb中上传和下载文件实例代码

    这篇文章主要介绍了JavaWeb中上传和下载文件实例代码,需要的朋友可以参考下
    2017-06-06
  • 详解Java反射各种应用

    详解Java反射各种应用

    Java除了给我们提供在编译期得到类的各种信息之外,还通过反射让我们可以在运行期间得到类的各种信息。通过反射获取类的信息,得到类的信息之后,就可以获取很多相关内容。下面跟着小编一起来看下吧
    2017-01-01
  • SpringBoot yml配置敏感信息加密的实现

    SpringBoot yml配置敏感信息加密的实现

    本文主要介绍了SpringBoot yml配置敏感信息加密的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • SpringMVC RESTFul实体类创建及环境搭建

    SpringMVC RESTFul实体类创建及环境搭建

    这篇文章主要为大家介绍了SpringMVC RESTFul实体类创建及环境搭建详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 浅谈C#与Java两种语言的比较

    浅谈C#与Java两种语言的比较

    今天小编就为大家分享一篇关于浅谈C#与Java两种语言的比较,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 使用IDEA查看jar包及jar包的正确打开方式

    使用IDEA查看jar包及jar包的正确打开方式

    IDEA 是把 jar 包添加为 Libraries,然后展开后即可查看,因为是编译后的 class 文件,所以注释是没有的,今天小编给大家介绍下使用IDEA查看jar包及jar包的正确打开方式,感兴趣的朋友一起看看吧
    2023-07-07
  • 基于java读取并引用自定义配置文件

    基于java读取并引用自定义配置文件

    这篇文章主要介绍了基于java读取并引用自定义配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 一文详解为什么用ElasticSearch以及和传统数据库MySQL有什么区别

    一文详解为什么用ElasticSearch以及和传统数据库MySQL有什么区别

    Elasticsearch和MySQL都是非常重要的数据库管理系统,它们在各种应用场景中都有着广泛的应用,这篇文章主要介绍了为什么用ElasticSearch以及和传统数据库MySQL有什么区别的相关资料,需要的朋友可以参考下
    2025-07-07
  • Java中二叉树的先序、中序、后序遍历以及代码实现

    Java中二叉树的先序、中序、后序遍历以及代码实现

    这篇文章主要介绍了Java中二叉树的先序、中序、后序遍历以及代码实现,一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成,需要的朋友可以参考下
    2023-11-11

最新评论