@Async引发的BeanCurrentlyInCreationException
创始人
2025-05-28 09:08:39

异常出现条件

  1. 开启异步处理注解 @EnableAsync
  2. 代码环境
@Service
public class AyncTestImpl implements AyncTest {@Autowiredprivate HelloServiceA helloServiceA;@Async@Overridepublic void sayHello() {helloServiceA.hello();}
}
@Service
public class HelloServiceA {@Autowiredprivate AyncTest ayncTest;public void hello(){System.out.println("hello A");}}
  1. 加载顺序,这里我们得确保Spring首先实例化AyncTestImpl 然后在实例化HelloServiceA。,同一个文件夹下AyncTestImpl 在HelloServiceA 前面默认加载顺序就可以符合。
    在这里插入图片描述
    DefaultListableBeanFactorypreInstantiateSingletons() 方法
    在这里插入图片描述

出现如下异常

警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'ayncTestImpl': Bean with name 'ayncTestImpl' has been injected into other beans [helloServiceA] 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.
Exception in thread "main" org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'ayncTestImpl': Bean with name 'ayncTestImpl' has been injected into other beans [helloServiceA] 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.at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:682)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:540)at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:369)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:283)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:367)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:905)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:943)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:591)at org.springframework.context.annotation.AnnotationConfigApplicationContext.(AnnotationConfigApplicationContext.java:108)at com.demo.Entrance.main(Entrance.java:41)

解释:: helloServiceA 注入的ayncTestImpl 不是最终的版本。我们知道ayncTestImpl的方法是需要进行异步执行,正常ayncTestImpl对象是没有这种功能的,要添加这种功能需要对ayncTestImpl对象进行代理,所以Spring有处理器对ayncTestImpl对象进行动态代理,使之具有异步方法功能。出现这个异常就是说helloServiceA 注入的ayncTestImpl的原始对象, 而Spring容器最终的aynnTestImpl的对象是进行代理之后具有异步功能的代理对象

解决方法

让Spring容器先完全的加载ayncTestImpl对象,容器注入ayncTestImpl代理对象之后再去,即可以在ayncTestImpl的注入对象加入@Lazy注解。

@Service
public class AyncTestImpl implements AyncTest {@Autowired@Lazyprivate HelloServiceA helloServiceA;@Async@Overridepublic void sayHello() {helloServiceA.hello();}
}

原理探究

设置Debug断点,我们直接看ayncTestImpl的Bean生命周期过程就行。
在这里插入图片描述

这里就不就Debug了,建议自己去Debug, 这里只总结出一个流程图,更容易接收

@Async增强时机与一般AOP增强时机的过程

在这里插入图片描述

总结

到这里,Async为什么会引发BeanCurrentlyInCreationException 就结束了,接着笔者还会出一篇博文, 探究@aync的增强原理,为什么我们开启了 @EnableAsync 注解,然后在方法上使用 @Async 就可以使用异步功能,以及如果异步方法出现了异常,Spring Async又提供了怎样获取异常处理扩展点呢?

相关内容

热门资讯

实测了解“樱花牛牛开挂辅助神器... 您好:樱花牛牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这款游戏...
实测推荐“牛魔王炸金花有没有挂... 您好:牛魔王炸金花这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9951342】很多玩家在这款...
平潭发展,这波行情走完了? 平... 不可能一直炒指数行情震荡,政策真空期,市场几乎没有主线的情况下,最适合“妖股出没”!从公司名字中含马...
今日资讯“财神十三张辅助开挂神... 您好:财神十三张这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在这款游...
最新一款“新大圣大厅.开挂辅助... 您好:新大圣大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9158489】很多玩家在这款游...