问题分析
当我们在方法上加上@Async注解时,我们希望此方法会在一个新的线程中执行,从而实现异步操作。但有时我们发现方法仍在主线程中执行,这就是异步注解没有生效,这种情况通常是Spring容器没有正确识别并管理异步方法的问题。
解决方案
1、配置@EnableAspectJAutoProxy
首先确保spring的配置类上加上此注解,以启动异步操作功能,这样spring容器才能正确识别并管理@Async注解标识的方法的执行
@Configuration
@RefreshScope
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
public class AppConfig {
#各种bean
}
2、使用代理对象调用异步方法
如果异步方法和被调用的时候是在同一个类中执行,那么就可能会失效,这是因为Spring Aop的特性,在同一个类调用异步方法会绕过代理对象,从而不会触发异步执行。
@Service
public class CommonService {@Asyncpublic void test() {}
}
解决这个问题的办法就是通过代理对象来调用异步方法,而不是直接调用异步方法本身。
@Service
public class CommonService {@Asyncpublic void test() {}public void test1() {CommonService proxy = AopContext.currentProxy();proxy.test();}
}
3、检查方法可见性
确保异步方法的权限是public或者protected