spring使用@Async注解导致循环依赖问题异常的排查记录

 更新时间:2023年08月31日 08:46:21   作者:我不是码农  
这篇文章主要介绍了spring使用@Async注解导致循环依赖问题异常的排查记录,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

因为布控预警我用到了@async来实现异步操作,在本地跑的时候一直没有报错,可是当我打包到服务器启动的时候却报了一个BeanCurrentlyInCreationException

Bean with name 'xxx' has been injected into other beans [xxx2] 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 version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example.

出现循环依赖报错了,于是我看了一下代码,的确有循环依赖的情况(这个是不好的习惯不要学,这里我之前没注意到,后面可以改一下),但是我记得明明spring是能够处理使用@Autowired注解形成的循环的,并不会导致报错,而且我本地也一直复现不了,非常的奇怪。

常代码发生点 spring的doCreateBean方法

于是我写了一个spring循环依赖使用@Async的demo并调试,异常代码的发生点在spring的doCreateBean方法

if (earlySingletonExposure) {
    Object earlySingletonReference = getSingleton(beanName, false);
    if (earlySingletonReference != null) {
        if (exposedObject == bean) { 
            exposedObject = earlySingletonReference;
        } else {
            //如果代理后的对象不等于原始对象就会抛异常了
        }
@Component
public class CircularTest {
    @Autowired
    CircularTest2 circularTest2;
}
@Component
public class CircularTest2 {
    @Autowired
    CircularTest CircularTest;
    @Async
    public void async() {
    }
}

开始我的代码是上面这样,spring初始化bean的顺序是先CircularTest再CircularTest2,每到初始化CircularTest2执行异常处代码的时候,直接earlySingletonReference返回的是null,所以一直复现不了,这时候我突然想到是不是spring初始化顺序的原因,因为之前也遇到过spring顺序不确定的问题,于是我改了一下代码

修改

@Component
public class CircularTest {
    @Autowired
    CircularTest2 circularTest2;
    @Async
    public void async() {
    }
}
@Component
public class CircularTest2 {
    @Autowired
    CircularTest CircularTest;
}

我把@Async方法换了个位置,这次竟然真的就复现了该异常,所以看来我本地的和服务器上的虽然代码一致,但是最终跑起来的spring的bean加载顺序变成不一样了,因为spring容器载入bean的顺序是不确定的,框架本身也没有约定特定顺序的逻辑规范,不过利用@Ordered,@Dependon等等注解自己实现依赖顺序那是另外一回事了,嗯复现bug了,下面调试一下spring循环依赖使用@Async注解为啥会报错

以上就是spring使用@Async注解导致循环依赖问题异常的排查记录的详细内容,更多关于spring @Async循环依赖异常的资料请关注脚本之家其它相关文章!

相关文章

  • Mybatis引入与使用的图文步骤

    Mybatis引入与使用的图文步骤

    本文主要介绍了Mybatis引入与使用的图文步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • 图文详解java反射机制及常用应用场景

    图文详解java反射机制及常用应用场景

    这篇文章主要为大家介绍了图文详解java反射机制及常用应用场景,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Java项目防止SQL注入的几种方式

    Java项目防止SQL注入的几种方式

    SQL注入是一种常见的攻击方式,黑客试图通过操纵应用程序的输入来执行恶意SQL查询,从而绕过认证和授权,窃取、篡改或破坏数据库中的数据,本文主要介绍了Java项目防止SQL注入的几种方式,感兴趣的可以了解一下
    2023-12-12
  • springmvc配置线程池Executor做多线程并发操作的代码实例

    springmvc配置线程池Executor做多线程并发操作的代码实例

    今天小编就为大家分享一篇关于springmvc配置线程池Executor做多线程并发操作的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Java线程中断的本质深入理解

    Java线程中断的本质深入理解

    Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己,本文将详细介绍,需要了解的朋友可以参考下
    2012-12-12
  • springboot实现rabbitmq消息确认的示例代码

    springboot实现rabbitmq消息确认的示例代码

    RabbitMQ的消息确认有两种, 一种是消息发送确认,第二种是消费接收确认,本文主要介绍了springboot实现rabbitmq消息确认的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 关于java中自定义注解的使用

    关于java中自定义注解的使用

    这篇文章主要介绍了关于java中自定义注解的使用,注解像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中,需要的朋友可以参考下
    2023-07-07
  • Java实现整数的逆序输出的三种方法

    Java实现整数的逆序输出的三种方法

    这篇文章主要介绍了Java实现整数的逆序输出的三种方法,第一种是无限制整数的逆序输出,第二种是非负整数的逆序输出,第三种是非特殊情况的逆序输出,每种方法给大家讲解的非常详细需要的朋友可以参考下
    2022-11-11
  • Java使用openssl检测网站是否支持ocsp

    Java使用openssl检测网站是否支持ocsp

    OCSP在线证书状态协议是为了替换CRL而提出来的。对于现代web服务器来说一般都是支持OCSP的,OCSP也是现代web服务器的标配,这篇文章主要介绍了Java使用openssl检测网站是否支持ocsp,需要的朋友可以参考下
    2022-07-07
  • Java的Jackson库中复杂对象集合的几种简单转换

    Java的Jackson库中复杂对象集合的几种简单转换

    本文主要介绍了Java的Jackson库中复杂对象集合的几种简单转换。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02

最新评论