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;
    }

}
相关推荐
橙序员小站4 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
怒放吧德德4 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆6 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
开心就好20257 小时前
UniApp开发应用多平台上架全流程:H5小程序iOS和Android
后端·ios
悟空码字7 小时前
告别“屎山代码”:AI 代码整洁器让老项目重获新生
后端·aigc·ai编程
小码哥_常8 小时前
大厂不宠@Transactional,背后藏着啥秘密?
后端
奋斗小强8 小时前
内存危机突围战:从原理辨析到线上实战,彻底搞懂 OOM 与内存泄漏
后端
小码哥_常8 小时前
Spring Boot接口防抖秘籍:告别“手抖”,守护数据一致性
后端
心之语歌8 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
None3218 小时前
【NestJs】基于Redlock装饰器分布式锁设计与实现
后端·node.js