Spring异步任务@Async的默认线程池执行器是如何初始化的

Spring异步任务@Async的默认线程池执行器,是从哪里来?是如何初始化的?

结论先行

异步任务@Async的默认线程池执行器是通过TaskExecutionAutoConfiguration#applicationTaskExecutor自动注入的。

异步任务的线程池执行器是如何初始化的?

从异步调用拦截器作为切入点,看看异步调用拦截器的调用流程是咋样的?

AsyncExecutionInterceptor#invoke

org.springframework.aop.interceptor.AsyncExecutionInterceptor

异步任务的执行调用入口

AsyncExecutionInterceptor#invoke ---> AsyncExecutionAspectSupport#determineAsyncExecutor

AsyncExecutionAspectSupport#determineAsyncExecutor

AsyncExecutionAspectSupport#determineAsyncExecutor ---> 先调用getExecutorQualifier(method),再调用this.defaultExecutor.get()

AnnotationAsyncExecutionInterceptor#getExecutorQualifier

getExecutorQualifier方法在AnnotationAsyncExecutionInterceptor#getExecutorQualifier被覆盖重写

AnnotatedElementUtils.findMergedAnnotation(method, Async.class)会返回@Async注解实例。
AnnotatedElementUtils.findMergedAnnotation(method, Async.class)是如何查找@Async注解?会起另一篇文章说明。

defaultExecutor是如何初始化的?

接下来,看看defaultExecutor是如何初始化的?
defaultExecutor初始化 ---> getDefaultExecutor(this.beanFactory)

AsyncExecutionAspectSupport#getDefaultExecutor

AsyncExecutionAspectSupport#getDefaultExecutor ---> 先调用beanFactory.getBean(TaskExecutor.class),再调用beanFactory.getBean(DEFAULT_TASK_EXECUTOR_BEAN_NAME, Executor.class)

AsyncExecutionInterceptor#getDefaultExecutor覆盖重写了本方法

debug调试发现super.getDefaultExecutor(beanFactory)已返回默认的执行器实例,说明是从beanFactory里获取的。
【猜想】可能是在哪个AutoConfiguration里自动注入的?

查看beanFactory里注入的bean实例列表,发现如下线索。
TaskExecutionAutoConfiguration

复制代码
applicationTaskExecutor -> {BeanDefinitionHolder@17669} "Bean definition with name 'applicationTaskExecutor' and aliases [taskExecutor]: Root bean: class [null]; scope=singleton; abstract=false; lazyInit=true; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration; factoryMethodName=applicationTaskExecutor; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/task/TaskExecutionAutoConfiguration.class]"

DefaultExecutor是否从TaskExecutionAutoConfiguration实例化而来

实例内存地址id是否一样?

TaskExecutionAutoConfiguration#applicationTaskExecutor

org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration

通过debug验证猜想,根据实例内存地址id,就是这里生成的。

TaskExecutionAutoConfiguration#taskExecutorBuilder

TaskExecutionAutoConfiguration#applicationTaskExecutor

实例内存地址id都是 ThreadPoolTaskExecutor@11620

org.springframework.beans.factory.support.SimpleInstantiationStrategy#instantiate

AsyncExecutionInterceptor#getDefaultExecutor

org.springframework.aop.interceptor.AsyncExecutionInterceptor#getDefaultExecutor

相关推荐
youyou-06061 分钟前
AUTOSAR‑COM 常见问题 QA (1)
java·linux·服务器·单片机·汽车
行百里er1 分钟前
Spring Insight 里如何对 Span 进行清洗
spring boot·spring cloud·监控
谢亮_vipxieliang4 分钟前
ValidX时间段验证详解:ISO 8601标准与简化格式
java·spring boot·后端·spring·spring cloud·hibernate
Lsetea5 分钟前
Java 请求 HTTPS 报 PKIX path building failed:从证书链到 truststore 的完整排查
java·https·ssl证书·keytool·truststore
蓝桉柒71 小时前
java判断语句
java·开发语言
Zane19941 小时前
String::compareTo凭什么能当参数传?方法引用的四种形式讲透
java·后端
青山木1 小时前
Hot 100 --- 打家劫舍
java·数据结构·算法·leetcode·动态规划
敲代码的嘎仔1 小时前
28届后端开发-百人小厂面试题
java·后端·面试·程序员·秋招·实习·转正
Bs_MoneyMagnet1 小时前
基于springboot+vue的爱心众筹系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·管理系统
名字还没想好☜2 小时前
Java Collectors.groupingBy 进阶:多级分组、下游收集器与统计聚合一次搞定
java·windows·后端·python·spring