记录一次 @Async 注解在开发中踩到的一个坑;

开发一个新功能时, 其中有个方法需要在程序初始化时执行一次, 因此使用了@PostConstruct 注解, 由于实际业务原因,导致此方法执行耗时较长,提取部分业务后添加@Async注解,想通过异步来处理, 不要让其影响到项目启动;

但是实际效果确并非如此,项目启动异常缓慢, @Async注解并未生效, 一开始以为是缺少@EnableAsync导致, 经核实在启动类上已配置该注解,后续经查询发现是@Async导致的; 

具体原因分析如下:

在使用@Async注解时,调用方法和@Async标注方法不能在同一个类中,会造成异步失效。这种情况主要是因为:spring在加载Bean时,先扫描是否有@Async,如果有就用代理模式,将其代理,如果@Async加载在类上,就代理改类中所有方法,如果加载在方法上就代理该方法,在别的类调用时,实际上是调用的代理类,如果在本类中调用,实际上是用本类的调用,并没有调用代理类,所以异步不生效。


得知原因后进行修改,问题得以解决;

参考原文链接:https://blog.csdn.net/qq_37247664/article/details/120303175