1.@Async注解使用条件

@Async源码
  • @Async注解一般用在类的方法上,如果用在类上,那么这个类所有的方法都是异步执行的;
  • 所使用的@Async注解方法的类对象应该是Spring容器管理的bean对象;
  • 调用异步方法类上需要配置上注解@EnableAsync

2.实现原理

为了更基础的分析异步调用背后的实现原理,这里选择使用xml配置文件的方式。使用xml配置文件方式时,一般会配置如下元素:

<task:annotation-driven executor="myExecutor" exception-handler="exceptionHandler"/>
<task:executor id="myExecutor" pool-size="5"/>
<bean id="exceptionHandler" class="com.abc.MyAsynExceptionHandler"/>

2.1 task标签

一般对于这种标签的解析都会有相应的NamespaceHandler,根据Spring命名的套路查找TaskNamespaceHandler类,具体代码如下:

TaskNamespaceHandler

(1)executor元素对应的ExecutorBeanDefinitionParser

ExecutorBeanDefinitionParser

该类从parse方法追踪具体的实现逻辑,这个类主要是根据executor元素中的配置,例如pool-size创建一个TaskExecutorFactoryBean对象,而在TaskExecutorFactoryBean中间接使用ThreadPoolExecutor创建了一个线程池,这个线程池会在annotation-driven元素解析类中用到

在TaskExecutorFactoryBean中可以看出:

TaskExecutorFactoryBean

(2)annotation-driven元素处理类AnnotationDrivenBeanDefinitionParser

AnnotationDrivenBeanDefinitionParser

默认情况下,如果没有配置mode属性,其值默认是proxy,使用代理模式,会创建一个AsyncAnnotationBeanPostProcessor,然后解析executor属性值和exception-handler属性值并将其设置到AsyncAnnotationBeanPostProcessor中。
该类实现了BeanFactoryAware接口,所以在其实例化时会执行setBeanFactory方法:

AsyncAnnotationBeanPostProcessor

创建AsyncAnnotationAdvisor对象,即给线程池创建了一个异步注解切面

AsyncAnnotationAdvisor

主要就是使用上面提到的executor元素解析得到的线程池和异常处理创建通知,使用@Async注解创建切入点
进入构建通知的方法中,buildAdvice(executor, exceptionHandler)

AsyncAnnotationAdvisor

AnnotationAsyncExecutionInterceptor间接实现了MethodInterceptor接口,而MethodInterceptor是AOP中切入点的处理器,处理器中最终被调用的是invoke方法,下面是invoke方法的源码:

AsyncExecutionInterceptor

doSubmit方法源码:

AsyncExecutionAspectSupport

AsyncAnnotationBeanPostProcessor类还间接实现了BeanPostProcessor接口,也就是说在bean初始化之前和之后会分别执行postProcessBeforeInitialization方法和postProcessAfterInitialization方法,而AsyncAnnotationBeanPostProcessor类的这两个方法是从AbstractAdvisingBeanPostProcessor类中继承来的,这里重点分析postProcessAfterInitialization方法,具体代码如下:

AbstractAdvisingBeanPostProcessor

创建代理可以使用Cglib或者jdk动态代理,这里选择JdkDynamicAopProxy深入分析,代理的创建这里就不深入分析了,这里重点关注一下调用代理时真正执行的invoke方法,方法体内容比较多,这里看一下如下重要代码:

JdkDynamicAopProxy

总结

Spring容器启动初始化bean时,判断类中是否使用了@Async注解,创建切入点和切入点处理器,根据切入点创建代理,在调用@Async注解标注的方法时,会调用代理,执行切入点处理器invoke方法,将方法的执行提交给线程池,实现异步执行。

所以,需要注意的一个错误用法是,如果A类的a方法(没有标注@Async)调用它自己的b方法(标注@Async)是不会异步执行的,因为从a方法进入调用的都是它本身,不会进入代理

作者:LZhan
链接:https://www.jianshu.com/p/69a7bbdaceeb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Spring @Async注解相关推荐

  1. Spring 异步@Async注解用法 Spring @Async注解用法总结 Spring @Async基本用法示例

    Spring 异步@Async注解用法 Spring @Async注解用法总结 Spring @Async基本用法示例 一.概述 在日常开发的工作中,经常会使用异步进行开发.Spring 提供一个简单 ...

  2. Spring @Async 注解

    2019独角兽企业重金招聘Python工程师标准>>> 1. spring 在扫描bean的时候会扫描方法上是否包含@async的注解 如果包含的,spring会为这个bean动态的 ...

  3. spring 使用@Async注解实现异步调用

    1.先定义一个事件,该类继承 ApplicationEven的抽象类 import org.springframework.context.ApplicationEvent;public class ...

  4. @async注解_史上最全的java spring注解

    史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...

  5. Spring : 异步注解 @EnableAsync 和 @Async

    文章目录 1.美图 2.概述 2.1 线程任务池配置 3. @EnableAsync 4.@Async 5.案例 5.1 任务类 5.2 带有返回值的方法如何使用@Async注解 1.美图 2.概述 ...

  6. Spring定时任务@scheduled多线程的使用(@Async注解)

    1.开篇 在Spring定时任务@Scheduled注解使用方式浅窥这篇文章里面提及过,spring的定时任务默认是单线程的,他在某些场景下会造成堵塞,那么如果我们想让每一个任务都起一条线程去执行呢? ...

  7. Spring循环引用-@Async注解启动报错,而@Transactional则不会

    目录 一.问题描述 二.问题分析 1.代理类 2.代理过程 三.结论 上接<Spring循环引用-@Async注解启动报错分析> 一.问题描述 Bean1Service注解@Async 启 ...

  8. 都在建议,不要直接使用 @Async 注解,为什么?

    欢迎关注方志朋的博客,回复"666"获面试宝典 本文讲述@Async注解,在Spring体系中的应用.本文仅说明@Async注解的应用规则,对于原理,调用逻辑,源码分析,暂不介绍. ...

  9. 为什么不建议直接使用 Async 注解?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:码农架构 应用场景 同步 异步 Spring 已经实现的线程池 Spring中启用@Async @Async应用默认线程池 @ ...

最新文章

  1. 基于GPUImage的美颜BeautifyFace详细注释
  2. hive-数据倾斜记录分享
  3. 视觉SLAM十四讲学习笔记——第四讲--李群与李代数
  4. boost::units模块实现展示信息单元系统
  5. vue history模式Nginx配置
  6. 需求分析——使用类图建模
  7. Upload LABS Pass-1
  8. 谁说数据分析很难?看完这7大分析套路后,还学不会的来找我
  9. 苹果HomePod mini出现连接不上Wi-Fi怎么办?解决办法来啦!
  10. 在电脑前,写点什么...
  11. C# List用法;用Exists判断是否存在符合条件的元素;判断是否存在
  12. 怎么查二手华为手机价格
  13. lg空调代码大全解决_LG空调故障代码大全-kg空调维修-lg空调维修手册
  14. 简述计算机总线概念内涵,总线的概念及其它相关知识细解
  15. 菜鸟又出手!家里没人也能收包裹,这个黑科技还获过阿里内部大奖
  16. 外观模式(Facade模式)详解
  17. AVI格式视频文件编码格式缺少编码解释器且该项目的编码格式不受支持(0xc00d5212错误)
  18. C# 产生验证码 利用背景图片绘制
  19. 小程序+动易SF制作随手拍实例全景式操作(3)
  20. 计算机开机出现ROM,电脑无法开机并显示EXITING INTEL PXE ROM如何解决

热门文章

  1. 大话设计模式(十三 有了门面,程序员的程序会更加体面!)
  2. 大话设计模式(三 复制VS复用)
  3. 《云计算》学习笔记2——Google的云计算原理与应用(GFS和MapReduce)
  4. 【caffe】windows下vs2013+opencv3.2.0+opencv_contrib(包含dnn)+cmake3.8编译与配置
  5. CUBA Platform 7.0.4 发布,企业级应用开发平台
  6. 为什么说ReasonReact是编写React的最佳方式?
  7. lt;xliff:ggt;标签
  8. Oracle的sqlplus登录方式
  9. 【机器学习】改善LBP特征提高SVM的可分性的经验总结(一)
  10. 区块链大热,和出版业如何发生关系?