@async原理

@EnableAsync 注解在Spring框架中用于启用异步方法执行的能力。其工作原理可以清晰地归纳为以下几个步骤:

  1. 注解的添加
    首先,在Spring Boot应用的启动类或配置类上添加 @EnableAsync 注解。这个注解的作用是向Spring容器声明,希望启用异步方法执行的支持。
    java
    复制
    @EnableAsync
    @SpringBootApplication
    public class MyApplication {
    public static void main(String[] args) {
    SpringApplication.run(MyApplication.class, args);
    }
    }
  2. 导入AsyncConfigurationSelector
    @EnableAsync 注解内部通过 @Import(AsyncConfigurationSelector.class) 导入了 AsyncConfigurationSelector 类。这个类是一个 ImportSelector 的实现,它会在Spring容器启动时根据注解的属性(如 mode)来选择性地导入配置类。
  3. 配置类的选择
    AsyncConfigurationSelector 根据 @EnableAsync 的 mode 属性(默认为 AdviceMode.PROXY)来决定导入哪个配置类。在大多数情况下,它会导入 ProxyAsyncConfiguration。
  4. AsyncAnnotationBeanPostProcessor的注册
    ProxyAsyncConfiguration 配置类会注册一个 AsyncAnnotationBeanPostProcessor 的bean。这个BeanPostProcessor是异步方法执行的关键。它会在Spring容器初始化bean的过程中,对bean进行后处理,检查并包装那些被 @Async 注解标记的方法。
  5. 异步方法的代理
    当 AsyncAnnotationBeanPostProcessor 发现一个bean的方法被 @Async 注解标记时,它会为这个方法创建一个代理。这个代理会拦截对原始方法的调用,并将其提交到一个异步执行器(Executor)中进行异步执行。默认情况下,Spring会使用 SimpleAsyncTaskExecutor,但也可以配置为使用其他类型的执行器,如线程池(ThreadPoolTaskExecutor)。
  6. 异步方法的执行
    当代理方法被调用时,它不会直接执行原始方法,而是将方法调用封装成一个任务,并提交给配置的异步执行器。执行器会负责在单独的线程中执行这个任务,从而实现异步方法的效果。
  7. 异常处理
    @Async 注解还支持配置异常处理器(AsyncUncaughtExceptionHandler),用于处理异步方法执行过程中抛出的未捕获异常。这有助于确保异步方法的异常能够被适当地处理,而不是被默默地忽略。
    总结
    通过 @EnableAsync 注解,Spring能够自动地为被 @Async 注解标记的方法提供异步执行的能力。这背后的机制涉及到了Spring的自动配置、BeanPostProcessor、AOP代理、异步执行器等多个组件的协同工作。通过这种方式,开发人员可以更加灵活地在Spring应用中实现异步编程,提高应用的性能和响应速度。
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值