首页 > 社交 > 科普中国

Spring

常驻编辑 科普中国 2022-05-29 切面   切入点   注解   线程   实战   源码   原理   过程   类型   方式   通知   方法
getExecutorQualifier 方法目的是获取 @Async 注解上的 value 值,value 值即线程池 Bean 的名称,如果获取到的 targetExecutor 不是 Spring 类型的线程池,则使用 TaskExecutorAdapter 进行适配,这也是为什么我们直接创建 Executor 类型的线程池 Spring 也是支持的原因。qHb拜客生活常识网

从以上源码逻辑可看出如果我们使用 @Async 注解时 value 值为空,Spring 就会使用 defaultExecutor ,defaultExecutor 是什么时候赋值的呢?上面内容已经有提及,在 buildAdvice 方法创建 AnnotationAsyncExecutionInterceptor 时 调用了其 configure 方法,如下:qHb拜客生活常识网

org.springframework.aop.interceptor.AsyncExecutionAspectSupport#configureqHb拜客生活常识网

qHb拜客生活常识网

原来当 defaultExecutor 和 exceptionHandler 是当初从 ProxyAsyncConfiguration 中获取用户自定义的 AsyncConfigurer 实现类而来的,那么如果 defaultExecutor 不存在怎么办?从源码可看出,defaultExecutor 其实是一个 SingletonSupplier 类型,如果调用 get 方法不存在,则使用默认值,默认值为:qHb拜客生活常识网

() -> getDefaultExecutor(this.beanFactory);

org.springframework.aop.interceptor.AsyncExecutionAspectSupport#getDefaultExecutorqHb拜客生活常识网

qHb拜客生活常识网

注意第一个红框的注释,此时 Spring 寻找默认的线程池 Bean 为指定 Spring 的 TaskExecutor 类型,并非 Executor 类型,如果 Bean 容器中没有找到 TaskExecutor 类型的 Bean,则继续寻找默认为以下名称的 Bean:qHb拜客生活常识网

public static final String DEFAULT_TASK_EXECUTOR_BEAN_NAME = "taskExecutor";

那么如果都没有找到怎么办呢?在这个方法直接返回 null 了,AsyncExecutionInterceptor 类覆写了 这个方法:qHb拜客生活常识网

org.springframework.aop.interceptor.AsyncExecutionInterceptor#getDefaultExecutorqHb拜客生活常识网

qHb拜客生活常识网

如果没有找到,则直接创建一个 SimpleAsyncTaskExecutor 类作为 @Async 注解底层使用的线程池。qHb拜客生活常识网

从匹配线程池源码得知,如果你创建的线程池 Bean 非TaskExecutor 类型并且没有使用实现 AsyncConfigurer 接口方式创建线程池,就需要主动指定线程池 Bean 名称,否则 Spring 会使用默认策略。qHb拜客生活常识网

总结

利用 BeanPostProcessor 机制在 Bean 初始化过程中创建一个 AsyncAnnotationAdvisor 切面,并且符合条件的 Bean 生成代理对象并将 AsyncAnnotationAdvisor 切面添加到代理中。qHb拜客生活常识网

可以看出 Spring 的很多功能都是围绕着 Spring IOC 和 AOP 实现的。qHb拜客生活常识网

Spring 默认线程池策略分析

有时候为了方便,我们不自定义创建线程池 bean 时,Spring 默认会为我们提供什么样的线程池呢?qHb拜客生活常识网

我们先来看下结果:qHb拜客生活常识网

qHb拜客生活常识网

很奇怪,明明我们都没有在项目中自定义线程池 Bean,按照以上源码的分析结果来看,此时 Spring 选择的是 SimpleAsyncTaskExecutor 才对,莫非是 super#getDefaultExecutor 方法找到了线程池 Bean?

相关阅读:

  • “想了两个月,馋了两个月”…上海人最爱的切面、馄饨皮
  • 面食大全114
  • 当你走投无路的时候,千万不要放弃,这恰恰是你绝处逢生的
  • 校长带发霉面包看望学生?先别急着指责校长
  • 手撕白菜/包菜
  • 过年吃饺子,十几年都是这个馅,3样食材搭配,鲜美,全家喜爱
  • 吃了半辈子疙瘩汤,这做法真是头一次见,味道鲜美,全家爱喝
  • 冬天发面时,记住别直接和面,把经验都告诉你,发面就是这么
  • 面包机可以代替厨师机揉面么?哪个揉面更好?
  • 今年夏天最爱的心机身体乳,涂完全身马上白2个度
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。