前言 最近星球中有位小伙伴问了我一个问题:他在项目某个方法使用@Async注解,但是还是该方法还是同步执行了,异步不起作用,到底是什么原因呢? 伪代码如下: @Slf4j @Service public class UserService { @Async public void async(Str
最近有小伙伴向我提出了一个问题:他在项目某个方法使用了
@Async
注解,但是该方法仍然同步执行,异步没有生效。这让我思考了一下,今天我将总结@Async注解失效的9种情景,希望对你有所帮助。
1. 未使用@EnableAsync注解
在Spring中启用@Async注解异步功能,需要在项目的启动类或配置类上使用
@EnableAsync
注解。例如:
@EnableAsync
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@EnableAsync
注解相当于一个开关,控制是否开启
@Async
注解异步功能,默认是关闭的。如果未使用@EnableAsync注解,则@Async注解异步功能无法生效。
2. 内部方法调用
在日常开发中,我们经常需要在一个方法中调用另一个方法。如果在Service类中的一个方法中调用另一个方法,则@Async注解的异步功能会失效。
3. 方法非public
在Java中有4种权限修饰符,例如public、private、protected和默认修饰符。如果在Service类中的方法权限修饰符定义错误,例如定义成private,也会导致@Async注解的异步功能失效。
4. 方法返回值错误
如果@Async注解的异步方法的返回值不是void或Future类型,也会导致异步功能失效。
5. 方法用static修饰了
使用@Async注解声明的方法必须是能被重写的,而static修饰的方法是不允许被重写的,因此static修饰的方法会导致@Async注解的异步功能失效。
6. 方法用final修饰
使用final关键字修饰的方法也会导致@Async注解的异步功能失效。
7. 业务类没加@Service注解
如果Service类没有使用@Service、@Component或者@Controller等注解声明,该类不会被Spring管理,因此也就无法使用Spring的异步功能。
8. 自己new的对象
在项目中自己new的对象不会被Spring管理,因此也就无法使用Spring的异步功能。
9. Spring无法扫描异步类
如果@ComponentScan注解定义的路径没有包含你新加的Service类的路径,@Async注解异步的功能也会失效。
最后说一句(求关注,别白嫖我)
如果这篇文章对您有所帮助,或者有所启发的话,帮忙扫描下发二维码关注一下,您的支持是我坚持写作最大的动力。求一键三连:点赞、转发、在看。关注苏三的公众号:【苏三说技术】,在公众号中回复:面试、代码神器、开发手册、时间管理有超赞的粉丝福利,另外回复:加群,可以跟很多BAT大厂的前辈交流和学习。
小编推荐阅读