相关推荐recommended
已解决org.springframework.beans.factory.BeanCurrentlyInCreationException Bean当前正在创建中异常的正确解决方法,亲测有效!!!
作者:mmseoamin日期:2024-04-01

已解决org.springframework.beans.factory.BeanCurrentlyInCreationException Bean当前正在创建中异常的正确解决方法,亲测有效!!!

目录

问题分析

出现问题的场景

报错原因

解决思路

解决方法

总结


在使用Spring框架进行项目开发时,BeanCurrentlyInCreationException是一个可能会遇到的异常,这个异常通常指示着一个bean在尝试被注入进其他bean时它自己还没有完全初始化完成。这种情况往往发生在有循环依赖的场景下。本文将对此问题进行详细分析,并提供有效的解决方案。

问题分析

当Spring容器启动时,它会创建并配置所有声明的bean。如果在这个过程中一个bean由于某些原因未能完成初始化,但又被其他bean所依赖,Spring就可能抛出BeanCurrentlyInCreationException。这通常是由bean之间不当的相互依赖所引起的。

出现问题的场景

假设我们有两个服务类ServiceA和ServiceB,其中ServiceA依赖于ServiceB,而ServiceB也依赖于ServiceA。如果这种依赖关系在Spring中没有得到妥善处理,那么在创建ServiceA和ServiceB的实例时,可能会出现BeanCurrentlyInCreationException。

报错原因

BeanCurrentlyInCreationException的直接原因是Spring容器在尝试解决bean之间的依赖关系时遇到了循环依赖,即一个bean的初始化直接或间接地依赖于它自身未完成初始化的状态。Spring默认情况下支持构造器注入的循环依赖,但是对于通过setter或字段注入产生的循环依赖,解决起来比较棘手。

解决思路

要解决该异常,主要的策略是消除循环依赖,或修改依赖注入的方式以避免循环依赖的产生。具体来说,可以采用以下几种方法:

  1. 重构代码以消除循环依赖:修改应用程序的设计,消除bean之间的循环依赖。
  2. 使用构造器注入代替字段/Setter注入:Spring可以处理构造器注入的循环依赖。
  3. 利用@Lazy注解来延迟依赖注入:通过延迟加载某些bean,可以避免初始化过程中的循环依赖问题。

解决方法

根据上述解决思路,以下是具体的操作步骤:

  1. 重构代码消除循环依赖:分析项目中的bean依赖关系,识别出导致循环依赖的部分。尝试重新设计这些组件的结构,使其不再相互依赖,或者依赖关系变得线性。

  2. 使用构造器注入:对于存在循环依赖的bean,将它们的注入方式从字段注入或Setter注入改为构造器注入。

    @Component
    public class ServiceA {
        private final ServiceB serviceB;
        
        @Autowired
        public ServiceA(ServiceB serviceB) {
            this.serviceB = serviceB;
        }
    }
    @Component
    public class ServiceB {
        private final ServiceA serviceA;
        
        @Autowired
        public ServiceB(ServiceA serviceA) {
            this.serviceA = serviceA;
        }
    }
    
  3. 使用@Lazy注解延迟依赖注入:如果重构代码或使用构造器注入不适用,可以在注入点使用@Lazy注解来延迟bean的加载和初始化。

    @Component
    public class ServiceA {
        @Lazy
        @Autowired
        private ServiceB serviceB;
    }
    @Component
    public class ServiceB {
        @Lazy
        @Autowired
        private ServiceA serviceA;
    }
    

总结

BeanCurrentlyInCreationException是Spring处理循环依赖时可能遇到的一个异常。通过重构代码、优化依赖注入方式或使用@Lazy注解,我们可以有效地解决这一问题,保证Spring容器的平滑启动和运行。在面对该异常时,仔细分析应用的依赖结构,并采取合适的措施进行调整,是解决问题的关键。希望本文的内容能帮助你更好地理解并解决BeanCurrentlyInCreationException,优化你的Spring应用开发。

 以上是此问题报错原因的解决方法,欢迎评论区留言讨论是否能解决,如果本文对你有帮助 欢迎 关注 、点赞 、收藏 、评论, 博主才有动力持续记录遇到的问题!!!

博主v:XiaoMing_Java

 📫作者简介:嗨,大家好,我是  小明(小明Java问道之路),互联网大厂后端研发专家,2022博客之星TOP3 / 博客专家 / CSDN后端内容合伙人、InfoQ(极客时间)签约作者、阿里云签约博主、全网5万粉丝博主。


🍅 文末获取联系 🍅  👇🏻 精彩专栏推荐订阅收藏 👇🏻

专栏系列(点击解锁)

学习路线(点击解锁)

知识定位

🔥Redis从入门到精通与实战🔥

Redis从入门到精通与实战

围绕原理源码讲解Redis面试知识点与实战

🔥MySQL从入门到精通🔥

MySQL从入门到精通

全面讲解MySQL知识与企业级MySQL实战

🔥计算机底层原理🔥

深入理解计算机系统CSAPP

以深入理解计算机系统为基石,构件计算机体系和计算机思维

Linux内核源码解析

围绕Linux内核讲解计算机底层原理与并发

🔥数据结构与企业题库精讲🔥

数据结构与企业题库精讲

结合工作经验深入浅出,适合各层次,笔试面试算法题精讲

🔥互联网架构分析与实战🔥

企业系统架构分析实践与落地

行业最前沿视角,专注于技术架构升级路线、架构实践

互联网企业防资损实践

互联网金融公司的防资损方法论、代码与实践

🔥Java全栈白宝书🔥

精通Java8与函数式编程

本专栏以实战为基础,逐步深入Java8以及未来的编程模式

深入理解JVM

详细介绍内存区域、字节码、方法底层,类加载和GC等知识

深入理解高并发编程

深入Liunx内核、汇编、C++全方位理解并发编程

Spring源码分析

Spring核心七IOC/AOP等源码分析

MyBatis源码分析

MyBatis核心源码分析

Java核心技术

只讲Java核心技术