Java面试题更新 2026-08-05

在Spring应用中,哪些情况下使用@Async注解会失效,无法实现异步执行效果?

风险判断技术原理Java

考察说明

考查对Spring异步注解@Async内部机制及其失效场景的理解。

回答思路

  1. 【回答框架 1】@Async基于AOP代理实现,当调用方直接通过对象内部方法调用或自调用时,不会经过代理,因此无法拦截,导致异步失效。
  2. 【回答框架 2】使用@Async的方法必须被Spring容器管理,如果方法所在Bean未被扫描或未通过ApplicationContext获取而使用new实例化,则不会生成代理,异步不生效。
  3. 【回答框架 3】代理方式默认基于JDK动态代理(针对接口)或CGLIB(针对类),如果目标类没有接口且未开启CGLIB代理配置,可能无法正确创建代理。
  4. 【回答框架 4】异步执行依赖线程池,如果自定义的Executor配置不当(如核心线程数为0,队列拒绝策略等),可能导致任务被拒绝或同步执行。
  5. 【回答框架 5】错误处理:@Async方法中异常不会被调用方捕获,需在方法内部自行处理,否则异常会丢失。
  6. 【关键点 1】自调用不会触发代理,导致异步失效。
  7. 【关键点 2】Bean必须由Spring容器管理,且方法需通过代理调用。
  8. 【关键点 3】异步执行依赖线程池,配置不当可能导致同步执行或任务拒绝。
  9. 【关键点 4】@Async方法异常需在方法内捕获,外部无法感知。
  10. 【易错点 1】误以为@Async保证执行顺序,实际无顺序保证。
  11. 【易错点 2】线程池配置不当如核心线程过少,可能导致任务排队或拒绝。
  12. 【易错点 3】异步方法调用事务可能失效,事务与异步需合理组合。