Spring Boot的循环依赖问题

目录

1.循环依赖的概念

2.解决循环依赖的方法

1.构造器方法注入:

2.@Lazy注解

3.@DependsOn注解


1.循环依赖的概念

两个或多个bean之间互相依赖,形成循环,此时,Spring容器无法确定先实例化哪个bean,导致循环依赖的问题。

代码示例:

java 复制代码
@Service
public class A{

    private B b;
    
    @Autowired
    public A(B b){
        this.b = b;
    }

}

@Service
public class B{

    private A a;

    @Autowired
    public B(A a){
        this.a = a;
    }

}

可以看到代码中,A的对象创建需要先实例化B的对象,而B的对象也需要先实例化A,此时形成了循环依赖。

2.解决循环依赖的方法

1.构造器方法注入:

在构造器中注入,解决循环依赖问题

java 复制代码
public class Main {
    public static void main(String[] args) {
        ClassB classB = new ClassB(null);
        ClassA classA = new ClassA(classB);
        classB.setClassA(classA);
    }
}

2.@Lazy注解

@Lazy注解具有延迟加载的功能,能够在需要该bean时再进行实例化

java 复制代码
@Service
@Lazy
public class A{

    private B b;
    
    @Autowired
    public A(B b){
        this.b = b;
    }

}

@Service
@Lazy
public class B{

    private A a;

    @Autowired
    public B(A a){
        this.a = a;
    }

}

3.@DependsOn注解

@DependsOn注解能够指定依赖项的加载顺序,从而避免循环依赖问题

如下代码中:@DependsOn("B")指定了A依赖于B,在实例化A之前,必须先实例化B,避免了循环依赖问题

java 复制代码
@Service
@DependsOn("B")
public class A{

    private B b;
    
    @Autowired
    public A(B b){
        this.b = b;
    }

}

@Service
@Lazy
public class B{

    private A a;

    @Autowired
    public B(A a){
        this.a = a;
    }

}
相关推荐
孙启超16 分钟前
【AI开发之Rust】第 3 课:字符串与复合类型 —— 数据怎么放
开发语言·人工智能·后端·rust·llm·transformer
代码调试师21 分钟前
【毕设分享】基于SpringBoot的旅游向导分配管理系统57145
spring boot·毕业设计·源码·课程设计·毕设·大作业·程序定制
_山海24 分钟前
Bun入门指南
前端·javascript·后端
2301_322414280441 分钟前
活力孕康复APP 47737- 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·mysql·微信小程序·idea·微信开发者工具
君顾11 小时前
外卖CPS软件开发实战:从系统架构到部署全流程指南
java·开发语言·外卖
vx_Biye_Design2 小时前
springboot游泳馆系统93765-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·spring·课程设计
名字还没想好☜2 小时前
Java NIO ByteBuffer 实战:flip/clear/compact 三个绕晕人的方法与 position/limit 心智模型
java·开发语言·后端·spring·nio
Wang's Blog2 小时前
Java框架快速入门: Spring Security+OAuth2之短信服务多供应商动态切换(阿里云与LeanCloud)
java·spring·阿里云
Doubbbbbbble云2 小时前
区间合并问题的常见算法模式与优化思路4
java·数据结构·算法
小溪学编程2 小时前
AQS 原理详解:从 CLH 队列到 ReentrantLock 的实现
java·开发语言