首页 > 教程 > 为什么@Async注解失效?9种情景解析

为什么@Async注解失效?9种情景解析

时间:2024-05-07 | 来源: | 阅读:70

话题: S C

前言 最近星球中有位小伙伴问了我一个问题:他在项目某个方法使用@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大厂的前辈交流和学习。


湘ICP备2022002427号-10湘公网安备:43070202000427号
© 2013~2019 haote.com 好特网