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循环依赖内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring AOP通知类型与实战示例讲解

    Spring AOP通知类型与实战示例讲解

    Spring AOP提供了五种通知类型:@Before、@After、@AfterReturning、@AfterThrowing和@Around,每种通知类型都有其特定的使用场景和实现方式,通过合理使用这些通知类型,可以实现各种横切关注点的模块化和解耦,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • springboot一个自定义注解如何搞定多线程事务

    springboot一个自定义注解如何搞定多线程事务

    文章介绍了Spring Boot中使用`@Async`注解进行声明式多线程编程的方法,以及如何通过自定义注解和AOP实现多线程事务控制,同时,还解释了`CountDownLatch`的使用场景及其工作原理
    2024-12-12
  • 使用IDEA直接连接MySQL数据库的方法

    使用IDEA直接连接MySQL数据库的方法

    这篇文章主要介绍了如何使用IDEA直接连接MySQL数据库,首先需要新建一个空项目,第一次连接 需要先下载驱动,文中给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • Java 中运行字符串表达式的方法

    Java 中运行字符串表达式的方法

    这篇文章主要介绍了Java 中运行字符串表达式的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • SpringBoot中事半功倍的工具类合集分享

    SpringBoot中事半功倍的工具类合集分享

    在日常开发中经常有这样那样的小功能需要实现,这些一般会作为工具类存在,在项目中有一些通用的功能,Spring内置了需要工具类,而且经过了大量的验证,可以在开发中助你一臂之力,快跟随小编一起来看看吧
    2023-02-02
  • SpringBoot全局异常捕获参数以及参数异常的解决方案

    SpringBoot全局异常捕获参数以及参数异常的解决方案

    这篇文章主要介绍了SpringBoot全局异常捕获参数以及参数异常的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • Mybatis-plus4条件构造器使用方式

    Mybatis-plus4条件构造器使用方式

    这篇文章主要介绍了Mybatis-plus4条件构造器使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 整理Java编程中常用的基本描述符与运算符

    整理Java编程中常用的基本描述符与运算符

    这篇文章主要介绍了Java编程中常用的基本描述符与运算符整理,包括运算符优先级等平时经常查看反复记忆的知识点,需要的朋友可以参考下
    2016-02-02
  • java8新特性-Stream入门学习心得

    java8新特性-Stream入门学习心得

    这篇文章主要介绍了java8新特性-Stream入门学习心得,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java SpringMVC 异常处理SimpleMappingExceptionResolver类详解

    Java SpringMVC 异常处理SimpleMappingExceptionResolver类详解

    这篇文章主要介绍了SpringMVC 异常处理SimpleMappingExceptionResolver类详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09

最新评论