BeanCurrentlyInCreationException 异常,提示在创建 mvcResourceUrlProvider Bean 时发生了循环依赖

1.循环依赖问题

提示:问题描述
核心问题
错误现象:在Spring Boot拦截器(Interceptor)中直接注入FeignClient时,触发循环依赖,抛出 BeanCreationException。
报错
错误代码如下,拦截器
拦截器代码
报错的 private TradeClient tradeClient;注解

2 解决办法

2.1使用@Lazy注解

使用@Lazy注解
在拦截器中注入FeignClient时,添加@Lazy延迟初始化
@Lazy注解的介绍

@LazySpring 框架中的一个注解,用于控制 Bean 的初始化时机。默认情况下,Spring 容器会在启动时一次性初始化所有被 @Component 或其衍生注解(如 @Service, @Repository, @Controller 等)标记的 Bean。而使用 @Lazy 注解后,Bean 的初始化会被延迟到第一次实际使用时才进行。
延迟加载:避免在容器启动时加载不必要的 Bean,从而减少内存占用和启动时间。
按需加载:只有当某个 Bean 被真正需要时(例如通过依赖注入或直接调用),才会被实例化。

说人话就是:只有被使用时才会被注册到Bean容器中

实例:
解决问题

3 详细解释问题

1 核心问题
错误现象:启动Spring应用时,因构造器注入导致循环依赖,抛出 BeanCurrentlyInCreationException 异常。
2 依赖链:A类依赖B类,B类依赖A类,形成闭环。
触发原因:
构造器注入(Constructor Injection)无法处理循环依赖。
Spring的三级缓存机制(Singleton Factories)无法在构造器阶段完成对象预缓存,导致实例化失败。
3.解决方案
改用Setter注入
将构造器注入改为Setter注入,Spring可通过@Autowired或@Inject延迟依赖注入,从而打破循环。
示例代码:

// 原构造器注入(错误)
public class A {
    private B b;
    public A(B b) {
        this.b = b;
    }
}
public class B {
    private A a;
    public B(A a) {
        this.a = a;
    }
}

// 修改为Setter注入(正确)
public class A {
    private B b;
    @Autowired
    public void setB(B b) {
        this.b = b;
    }
}
public class B {
    private A a;
    @Autowired
    public void setA(A a) {
        this.a = a;
    }
}

调整依赖关系
重构代码,消除循环依赖(如抽取公共服务类、调整模块职责)。
使用@Lazy注解
在字段注入时添加@Lazy,延迟目标Bean的初始化:

@Autowired
@Lazy
private B b;

小结

提示:结合网上的资源的自我理解,不对的地方希望大家能给予指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值