SpringBoot中手动new实例调用@Async异步方法不生效是否正常?
结论
这种调用方式完全不可行,属于Spring @Async 注解的典型误用,也是你异步逻辑不生效的核心原因。
失效原因
- 你通过
new AsyServiceImpl()手动创建的对象不受Spring容器管理,@Async依赖的AOP代理逻辑根本不会织入到这个对象上。此时调用saveUsers就是最普通的同步方法调用,不会提交到异步线程池执行。 - 即使正确拿到Spring管理的Bean,
@Async生效还要满足两个必要条件:- 项目启动类必须加
@EnableAsync注解,否则Spring不会解析异步切面 - 异步方法不能用private修饰,也不能在同一个类中直接自调用(同类调用不经过代理,异步同样失效)
- 项目启动类必须加
- 你无法获取执行结果的另一个原因是:当前
saveUsers定义为void返回值,本身不具备传递异步执行结果的能力。
正确写法
- 禁止手动new Service实例,通过依赖注入获取Spring生成的代理对象:
// 在调用方Service中注入,不要手动实例化 @Autowired private AsyServiceImpl asyServiceImpl; public void businessMethod() { // 前置业务逻辑 asyServiceImpl.saveUsers(yourList); }
- 如果需要获取异步执行结果,将方法返回值改为
CompletableFuture类型:
@Async public CompletableFuture<Integer> saveUsers(List<SomeModel> list) { // 执行用户保存逻辑 int affectedRows = // 实际插入数据条数 return CompletableFuture.completedFuture(affectedRows); }
调用方拿到返回的CompletableFuture实例后,就可以通过阻塞等待或者回调的方式获取异步执行结果。
内容的提问来源于stack exchange,提问作者Adityaraj Singh
相关产品推荐
相关产品推荐

