返回

## 一篇以@Async注解坑为例的错误分析文章

后端

大家好。

背景

前段时间,一个同事小姐姐跟我说她的项目起不来了,让我帮忙看一下,本着助人为乐的精神,这个忙肯定是要帮。

于是,我在她的控制台发现了如下的异常信息:

BeanCurrentlyInCreationException: Error creating bean with name 'sampleService': Bean instantiation via factory method threw exception; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'sampleService': Bean instantiation via factory method threw exception; nested exception is java.lang.NoSuchMethodError: 'org.springframework.aop.interceptor.AsyncExecutionInterceptor.after(org.aopalliance.intercept.Joinpoint)'

问题分析

从异常信息可以看出,问题出在@Async注解上。@Async注解用于将方法标记为异步方法,以便在单独的线程中执行。在上面的代码中,sampleService类中的sampleMethod方法被标记为异步方法。

但是,在我们的项目中,我们并没有使用@Async注解。因此,我们猜测可能是某个依赖库使用了@Async注解,导致了这个问题。

经过一番排查,我们发现问题出在了一个我们使用的日志库上。这个日志库使用了@Async注解,导致了我们项目中出现了BeanCurrentlyInCreationException异常。

解决方案

为了解决这个问题,我们可以在我们的项目中排除这个日志库的依赖。或者,我们也可以在我们的项目中显式地使用@Async注解,以便与日志库中的@Async注解兼容。

总结

在使用@Async注解时,需要注意以下几点:

  • @Async注解只能用于方法上,不能用于类上或接口上。
  • @Async注解不能用于构造方法或静态方法上。
  • @Async注解只能用于public方法上。
  • 在使用@Async注解时,需要注意避免循环依赖。
  • 在使用@Async注解时,需要注意线程安全问题。