java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Springboot循环依赖

Springboot循环依赖的原因及解决

作者:帝锦_li

本文主要介绍了Spring Boot中的循环依赖问题,包括循环依赖的定义、产生原因以及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

什么是循环依赖

循环依赖(Circular Dependency) 是指两个或多个 Bean 相互直接或间接依赖,导致容器无法正常初始化这些 Bean。

@Service
public class ServiceA {
    @Autowired
    private ServiceB serviceB; // ServiceA 依赖 ServiceB
}

@Service
public class ServiceB {
    @Autowired
    private ServiceA serviceA; // ServiceB 依赖 ServiceA
}

Spring Boot 基于 Spring 框架,其循环依赖的处理机制与 Spring 一致,但在 Spring Boot 2.6+ 版本中默认禁止了循环依赖(通过 spring.main.allow-circular-references=false)。 

产生循环依赖的原因

1.构造函数注入循环依赖

@Service
public class ServiceA {
    private final ServiceB serviceB;
    public ServiceA(ServiceB serviceB) { // 构造函数注入
        this.serviceB = serviceB;
    }
}

@Service
public class ServiceB {
    private final ServiceA serviceA;
    public ServiceB(ServiceA serviceA) { // 构造函数注入
        this.serviceA = serviceA;
    }
}

2.Setter/Field 注入循环依赖

在spring中使用@Autowired注解标签进行自动注入,如果不加以处理,会出现循环依赖问题 。

怎么解决循环依赖

在Springboot2.5以前可以通过三级缓存解决单例 Bean 的循环依赖问题。

缓存名称职责
singletonObjects存放完全初始化好的 Bean(一级缓存)
earlySingletonObjects存放提前暴露的早期 Bean(二级缓存)
singletonFactories存放 Bean 的工厂对象(三级缓存)

以最初的ServiceA与ServiceB为例,

 出现循环依赖之后的几个解决思路:

1.避免循环依赖(推荐)

2. 允许循环依赖(临时方案)

在 application.properties 中显式允许循环依赖:

# Spring Boot 2.6+ 需要手动开启
spring.main.allow-circular-references=true

这种只适用于Springboot版本在2.6以上的循环依赖被禁止的情形。 

3. 使用 @Lazy 延迟加载

在其中一个依赖上添加 @Lazy,延迟注入 Bean 的初始化:

@Service
public class ServiceA {
    @Lazy
    @Autowired
    private ServiceB serviceB; // 延迟初始化 ServiceB
}

4. 调整注入方式

 优先使用 Setter/Field 注入:避免构造函数注入导致的不可解循环依赖。

@Service
public class ServiceA {
    private ServiceB serviceB;
    
    @Autowired
    public void setServiceB(ServiceB serviceB) { // Setter 注入
        this.serviceB = serviceB;
    }
}

 使用setter注入

循环依赖的局限性

总结

Spring Boot 的循环依赖本质是 Spring 框架的机制问题,解决核心在于:

 尽可能在设计之初就避免循环依赖

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

您可能感兴趣的文章:
阅读全文