技术分享之Async注解

113 阅读1分钟
  1. 核心机制

    通过BeanPostProcessor注入代理对象

       异步执行

AnnotationAsyncExecutionInterceptor<—AsyncExecutionInterceptor <— MethodInterceptor#invoke

2、源码分析

  • 启用异步注解 @EnableAsync,@Import(AsyncConfigurationSelector.class),找到对应的配置类 ProxyAsyncConfiguration;--EnableXXX类注解原理

  • AsyncAnnotationBeanPostProcessor 实现了BeanFactoryAware 和 BeanPostProcessor两个接口

  • 硬编码使用 AsyncAnnotationAdvisor 作为AOP切面

  • 在服务器启动时,依赖BeanPostProcessor#postProcessAfterInitialization生成代理对象

  • 生成代理类时会把Advisor应用到代理工厂

  • AsyncAnnotationAdvisor 实现了 PointcutAdvisor接口,对切入点和通知的包装

  • PointcutAdvisor是AOP框架抽象的切面接口

  • 切入点默认匹配@Async注解

  • 通知对应的是 AnnotationAsyncExecutionInterceptor,MethodInterceptor的实现,真正的执行逻辑

3、应用

  • 通过实现AsyncConfigurer自定义线程池及异常处理

  • 如果需要返回值需要使用Future类型

  • 必须是类之间的调用才会生效,类内部方法调用异步注解不生效(同@Transactional)

   *  在异步方法中应避免查询主线程插入或更新的数据,因为CPU的切换无法保证执行顺序

4、扩展

@Transactional注解是怎么实现的?

启用事务:@EnableTransactionManagement

切面:BeanFactoryTransactionAttributeSourceAdvisor

切入点:AnnotationTransactionAttributeSource

org.springframework.transaction.interceptor.AbstractFallbackTransactionAttributeSource#computeTransactionAttribute

通知:TransactionInterceptor implements MethodInterceptor