BeanCurrentlyInCreationException异常分析及解决

Spring Boot报错「BeanCreationException」:循环依赖与作用域配置的解决方案 的核心矛盾在于依赖注入链断裂与作用域配置冲突循环依赖:优先重构代码,其次使用@Lazy或Setter注入,多例模式下通过或代理解决。作用域配置:无状态服务用单例,有状态服务用多例,跨作用域注入时启用代理。性能优化:减少单例Bean数量,避免频繁创建实例,合理使用@Lazy和对象池。最佳实践设计阶段避免循环依赖:通过模块化设计或引入中间层解耦。多例Bean显式配置代理:在@Scope中添加。定期监控Bean依赖关系:使用Spring Boot Actuator的端点。 阅读详情

异常分析

        Spring Boot 出现BeanCurrentlyInCreationException: Error creating bean with name: Requested bean is currently in creation异常是因为出现了两个bean相互依赖。如果 bean A依赖于bean B,而bean B又依赖于bean A,则将产生BeanCurrentlyInCreationException异常。

BEAN A -> BEAN B -> BEAN A  (两个bean循环依赖)

BEAN A -> BEAN B -> BEAN C -> BEAN A  (三个bean循环依赖)

当 spring boot 应用程序加载所有 bean 时,它会尝试自动连接依赖 bean。如果两个 bean 处于循环依赖关系中,则每个 bean 将等待另一个 bean 加载。加载 bean 时会出现死锁。因此,Spring Boot 应用程序将抛出异常。

如果 spring boot 应用程序中的两个或多个bean参与循环依赖,则spring boot应用程序无法在应用程序上下文中加载任何bean,因为每个bean 依赖于另一个bean。Spring boot 无法决定在循环依赖中首先加载哪个bean。因此,在将 bean 加载到应用程序上下文中时,spring boot 会抛出异常。

出现循环依赖的示例:

package com.demo;

public interface Animal {
    String  getName();
}
package com.demo;

import org.springframework.stereotype.Component;

@Component
public class Lion  implements Animal {
    public Lion(Tiger tiger) {

    }

    @Override
    public String getName() {
        return "Lion";
    }
}
package com.demo;

import org.springframework.stereotype.Component;

@Component
public class Tiger  implements Animal {
    public Tiger(Lion lion){

    }

    @Override
    public String getName() {
        return "Tiger";
    }
}

项目启动后会报以下错误:

***************************

APPLICATION FAILED TO START

***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

┌─────┐

|  lion defined in file [D:\project\study\java\springbean-demo\target\classes\com\demo\Lion.class]

↑     ↓

|  tiger defined in file [D:\project\study\java\springbean-demo\target\classes\com\demo\Tiger.class]

└─────┘

解决方案1:

循环依赖是由于编程或架构的问题。遍历属于循环依赖的 bean,考虑重新设计 bean。这将解决异常。组件必须加载到分层依赖模型而不是循环模型中。为了解决这个异常,应该重新设计 bean 的加载顺序。

解决方案2:

循环依赖中的 bean 可以使用 @Autowired 注释加载。@Autowired 注释创建一个 bean 并加载依赖项。这将解决异常。但是,如果 bean 中的方法相互依赖,则会导致异常。

@Component
public class Lion  implements Animal {
    @Autowired
    private Tiger tiger;

    @Override
    public String getName() {
        tiger.getName();
        return "Lion";
    }
}
@Component
public class Tiger  implements Animal {
    @Autowired
    private Lion lion;

    @Override
    public String getName() {
        lion.getName();
        return "Tiger";
    }
}

解决方案3

Spring Boot 应用程序支持 bean 的延迟加载。@Lazy 注释在需要时加载 bean,而不是在开始时加载它。在创建 bean 并将其加载到上下文中后,将注入 bean。首先将创建循环依赖项中的 bean,然后将其他 bean 注入 bean。

@Component
public class Lion  implements Animal {
    public Lion(@Lazy Tiger tiger) {

    }
    
    @Override
    public String getName() {
        return "Lion";
    }
}

@Component
public class Tiger  implements Animal {
    public Tiger(@Lazy Lion lion){

    }

    @Override
    public String getName() {
        return "Tiger";
    }
}

解决方案4

spring boot 注解@PostConstruct 将用于在构造函数方法被调用后执行一个方法。可以使用后构造方法启动循环依赖 bean。Bean 将首先使用构造函数创建,然后将使用带注释的 @PostConstruct 方法创建 bean。

@Component
public class Lion  implements Animal {
    @Autowired
    Tiger tiger;

    @PostConstruct
    public void load() {
        tiger.setLion(this);
    }

    @Override
    public String getName() {
        return "Lion";
    }

    public void setTiger(Tiger tiger) {
        this.tiger = tiger;
    }
}

@Component
public class Tiger  implements Animal {
    @Autowired
    Lion lion;

    @PostConstruct
    public void load() {
        lion.setTiger(this);
    }

    @Override
    public String getName() {
        return "Tiger";
    }

    public void setLion(Lion lion) {
        this.lion = lion;
    }
}

解决方案5

@Autowired 注解可以在 setter 方法中使用。可以使用 @Autowired setter 方法分配 Bean。首先加载 bean,然后调用 setter 方法来自动连接其他 bean。

@Component
public class Lion  implements Animal {
    Tiger tiger;


    @Override
    public String getName() {
        return "Lion";
    }

    @Autowired
    public void setTiger(Tiger tiger) {
        this.tiger = tiger;
    }
}

@Component
public class Tiger  implements Animal {
    Lion lion;


    @Override
    public String getName() {
        return "Tiger";
    }

    @Autowired
    public void setLion(Lion lion) {
        this.lion = lion;
    }
}

翻译自:https://www.yawintutor.com/beancurrentlyincreationexception-error-creating-bean-with-name-requested-bean-is-currently-in-creation/

Requested bean is currently in creation: Is there an unresolvab circular reference? 关于Feign的一个bug,A服务的拦截器调用B服务,A服务启动时报bug org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'springApplicationAdminRegistrar': Singleton bean creation not allowed while singletons of this factory are in destructio 阅读详情

相关推荐

Spring循环依赖排查与解决:从BeanCurrentlyInCreationException到LDAP数据模型

循环依赖是Java服务端开发中绕不开的经典问题,尤其在使用Spring容器管理对象时,构造器注入很容易触发启动期的BeanCurrentlyInCreationException。理解Spring三级缓存的工作原理,有助于快速定位两个Bean之间的回环链路。同时,在LDAP目录模型里,LdapUser与LdapGroup互相引用还会导致运行期的StackOverflowError,这与启动期的依赖循环是两种不同层面的坑。面对这些问题,既可以用@Lazy或ObjectProvider做最小化止血,也要通过下沉

weixin_29304021的博客 219

BeanCurrentlyInCreationException(Bean当前正在创建异常)可能的原因和解决方法

理解项目中 Bean 的依赖关系,并确保合理的依赖注入方式,是预防和解决循环依赖问题的关键。表示在尝试实例化一个 Bean 时,Spring 容器检测到正在创建的 Bean 已经在创建过程中,导致循环依赖。如果在 Bean 的初始化过程中,通过 ApplicationContext 主动获取了该 Bean 的实例,可能导致循环依赖问题。循环依赖可能是由于依赖注入问题引起的,例如字段注入导致的循环依赖。当循环依赖的 Bean 的范围不是单例时,可能导致。检查 Bean 的定义,确保没有循环依赖的配置错误。

Java开源程序猿 2838

Error creating bean with name ‘redisTemplate‘ defined in class path resource【Bug已解决】

在Redis项目里配置过程中 单元测试中爆红:在配置完成RedisConfing之后,RedisConfing配置如下: 原因分析: 缺少Jackson依赖。 安装即可解决 Error creating bean with name ‘redisTemplate’ defined in class path resource【Bug已解决】如果不能解决,请检查版本是否匹配~ 我的配置如下,可以成功运行

一键难忘的博客 3029

org.springframework.beans.factory.BeanCurrentlyInCreationException Bean当前正在创建中异常的解决方案

org.springframework.beans.factory.BeanCurrentlyInCreationException 是 Spring 框架中的一个异常,表示在尝试依赖注入时,发现了一个正在创建的循环依赖(circular dependency),即一个或多个 bean 依赖于彼此,且它们的创建过程相互依赖,形成了一个闭环。这会导致 Spring 容器无法完成这些 bean 的创建和初始化。

2301_79779756的博客 2039

SGLang HiCache实战:手把手教你配置KV Cache Offload,让大模型推理成本直降84%

本文详细介绍了SGLang HiCache在KV Cache Offload配置与调优中的实战应用,通过多级存储架构和智能卸载策略,显著降低大模型推理成本达84%。文章涵盖HiCache架构优势、环境配置、高级调优策略及生产环境最佳实践,帮助开发者优化GPU显存使用,提升并发处理能力。

weixin_29044713的博客 464

别再死记公式了!用TL072运放设计带通滤波器,调出干净正弦波的实战心得与误区盘点

本文分享了使用TL072运放设计带通滤波器的实战经验,重点解决波形失真问题,提供单电源供电优化、动态调谐技巧及仿真与现实的参数修正方法,帮助工程师调出纯净正弦波。内容涵盖模拟电路设计中的常见误区与解决方案,适合电子工程师和爱好者参考。

weixin_29172963的博客 408

使用@Async异步注解导致该Bean在循环依赖时启动报BeanCurrentlyInCreationException异常的根本原因分析,以及提供解决方案【享学Spring】

使用@Async异步注解导致该Bean在循环依赖时启动报BeanCurrentlyInCreationException异常的根本原因分析,以及提供解决方案【享学Spring】

Littleree的博客 108

音视频从入门到精通——指数哥伦布码原理

在计算机中,一般数字的编码都为二进制,但是由于以相等长度来记录不同数字,因此会出现很多的。

mirana的专栏 1383

使用@Async异步注解导致该Bean在循环依赖时启动报BeanCurrentlyInCreationException异常的根本原因分析,以及提供解决方案

前言 今天在自己工程中使用@Async的时候,碰到了一个问题:Spring循环依赖(circular reference)问题。 或许刚说到这,有的小伙伴就会大惊失色了。Spring不是解决了循环依赖问题吗,它是支持循环依赖的呀?怎么会呢? 不可否认,在这之前我也是这么坚信的,而且每次使用得也屡试不爽。倘若你目前也和我有一样坚挺的想法,那么相信本文能让你大有收货~~。 不得不提,关于@Async的使用姿势,请参阅: 【小家Spring】Spring异步处理@Async的使用以及原理、源码分析(@Ena

hellozhxy的博客 823

DRM全解析 —— encoder详解(3)

DRM全解析 —— encoder详解(3)

phmatthaus的专栏 493

用 sapgenpse 把 SAPCRYPTOLIB 的 SNC 真正配通

摘要: 在SAP系统中配置SNC(Secure Network Communications)时,sapgenpse工具是关键,尤其在旧版本或组件缺乏图形化维护工具时。核心步骤包括安装SAP Cryptographic Library、创建PSE(Personal Security Environment)、生成运行凭据,并确保证书交换顺序正确。常见问题如RFC连接失败或握手错误,往往源于PSE创建或凭据配置不当。需特别注意SECUDIR目录设置、PSE身份管理(单一或独立PSE方案)、以及服务账号凭据的权

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 66

一次spring启动报错BeanCurrentlyInCreationException背后的原因分析-什么情况下循环注入会报错...

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33725515的博客 1724

(3dnr)多帧视频图像去噪 (一)

视频图像去噪主要利用相邻帧间内容相似性,通过时域帧平均降低随机噪声。为避免运动物体产生"拖尾"现象,可采用运动自适应或运动补偿时域滤波方法。前者根据运动强度动态调整滤波系数,后者通过运动补偿使参考帧更接近当前帧。运动补偿方法虽能更好处理运动区域,但计算复杂度高且对快速运动场景效果有限。相比之下,运动自适应方法在实时视频处理中更具优势,能平衡去噪效果与硬件资源消耗。两种方法可根据场景动态切换以获得最佳去噪效果。

大熊 1873

Spring循环依赖终极解决方案:从BeanCurrentlyInCreationException到根治的完整指南

Spring Framework作为企业级开发的中流砥柱,其依赖注入机制极大简化了组件管理。但Bean之间的循环依赖常导致`BeanCurrentlyInCreationException`异常,让开发者头疼不已。本文将系统剖析循环依赖的本质,结合Spring源码与实践案例,提供从诊断到根治的完整解决方案,助你轻松化解依赖困境。 ## 一、循环依赖的"前世今生":为何单例Bean能自愈而原型Be

gitblog_00113的博客 1094

基于 YOLOv26 的陶瓷产品缺陷检测系统:智能视觉质检方案

本文提出了一种基于YOLOv26深度学习模型的陶瓷产品智能缺陷检测系统。该系统针对陶瓷生产中的裂纹、气泡、釉面缺陷等8类常见质量问题,采用YOLOv26目标检测算法实现高精度自动化检测。系统架构包含数据采集、预处理、YOLOv26检测和后处理四个模块,具有多类别分类、实时推理和强鲁棒性等技术优势。文章详细介绍了数据预处理与增强方法,并提供了Python代码实现示例。该方案可显著提升陶瓷产品质量检测效率,替代传统人工检测方式,为陶瓷制造业提供智能化质检解决方案。

一键难忘的博客 794

从你的全世界路过---陌陌X-SIGN还原

我们上期介绍了hook 接口方式,今天我分析so 层。学习是为了复杂的事情简单化。不用如此繁琐。跟进native_sdbyecbu37x这个函数,我们f5看伪代码 v13 = sign(v9, v10, v11, a6); 跟进这个函数 代码如下(示例): 2.代码贴入 SHA消息摘要java代码如下: java 代码如下(示例): 总结 算法,结合动态调试!

任雪飘的博客 2303

同时使用 @Transactional和@Async出现的报错

问题场景 在上一篇文章中spring中autowired注入自己的代理后,最后容器中的对象是原对象还是代理对象,我们谈到了在spring中autowired注入自己的代理后,最后容器中只有一个对象。 现在我们给文章中涉及的代码加@Async注解 @Service public class UserRightService { @Autowired private UserRightService userRightService; @Transactional @Async

cyh的博客 3732

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Bean的原始版本与最终版本不一致?记一次Spring IOC探索之旅

背景 在Java的生态中,Spring几乎是所有项目开发的必备框架,尤其Spring IOC、Spring AOP,更是Java项目最常用的功能。 最近,在使用Spring过程中,遇到以下问题: 开发人员开发自测完毕,将内容提测到测试环境,却发现测试环境启动不起来,同样的代码回到开发人员的环境却是正常的。在测试环境报的异常类似这样的: 2020-08-01 09:54:48.490 ERROR 628 — [ restartedMain] o.s.boot.SpringApplication

尼克同学的博客 1019

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spring循环依赖排查:从BeanCurrentlyInCreationException到三级缓存与构造器注入

依赖注入是Spring框架的核心能力,而Bean生命周期决定了依赖在哪个阶段被解析。Spring通过三级缓存(singletonFactories、earlySingletonObjects、singletonObjects)在单例Bean实例化后提前暴露早期引用,从而为字段注入形成的循环依赖提供兜底;但构造器注入发生在实例化阶段,此时容器还没有可暴露的Bean引用,因此会直接抛出BeanCurrentlyInCreationException。理解这套机制,能帮助开发者判断哪些循环依赖可以通过@Lazy或

weixin_34101914的博客 229

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

spring 使用 @Async 循环依赖时报 BeanCurrentlyInCreationException 的问题

spring中 @Async 报BeanCurrentlyInCreationException分析

langwuzhe的博客 675

spring中BeanPostProcessor引发的循环依赖异常

一 循环依赖问题 最近在项目中遇到如下异常 Bean with name ‘departmentServiceImpl’ has been injected into other beans [userServiceImpl] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final ve

weixin_43832505的博客 1282

聊一聊Spring中当循环依赖遇到@Async的那点事儿

本文是对Spring中当循环依赖遇到@Async的工作原理解读以及解决方案

小宝潜行的博客 1491

关于@Async注解的坑,千万要小心!

早期暴露出去的对象,可能是AService本身或者是AService的代理对象,而且是通过AnnotationAwareAspectJAutoProxyCreator对象实现的,但是通过AsyncAnnotationBeanPostProcessor的回调,会对AService对象进行动态代理,这就导致AService早期暴露出去的对象跟最后完全创造出来的对象不是同一个,那么肯定就不对了。也就说,AOP和@Async注解虽然底层都是动态代理,但是具体实现的类是不一样的。不错,还真的不太一样,请继续往下看。

jcc4261的博客 498

三级缓存为什么解决不了构造器注入的循环依赖?

Spring循环依赖处理机制分析:通过对比Setter注入和构造器注入的流程差异,揭示Spring处理循环依赖的核心机制。Setter注入时,Spring通过三级缓存(提前暴露对象工厂)成功解决循环依赖;而构造器注入由于需要在实例化阶段就完成依赖注入,导致无法提前暴露引用,最终抛出BeanCurrentlyInCreationException。源码分析表明,只有在实例化完成后才会将对象工厂加入三级缓存,这是构造器注入无法解决循环依赖的关键原因。实际测试也验证了这一结论。

tanxinji的博客 436
上一篇: TestNG使用(十二)——TestNG中的JVM参数
下一篇: Spring Cloud Hystrix实现原理
思维的深度
博客等级 码龄11年 2万+粉丝 391原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值