当前位置: 首页 > news >正文

@EnableAsync+@Async源码学习笔记之三

接上一篇,本文我们进入 AsyncAnnotationBeanPostProcessor 的分析,这个类的源代码如下:

package org.springframework.scheduling.annotation;import java.lang.annotation.Annotation;
import java.util.concurrent.Executor;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import org.springframework.aop.framework.autoproxy.AbstractBeanFactoryAwareAdvisingPostProcessor;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.core.task.TaskExecutor;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;/*** Bean post-processor that automatically applies asynchronous invocation* behavior to any bean that carries the {@link Async} annotation at class or* method-level by adding a corresponding {@link AsyncAnnotationAdvisor} to the* exposed proxy (either an existing AOP proxy or a newly generated proxy that* implements all of the target's interfaces).** <p>The {@link TaskExecutor} responsible for the asynchronous execution may* be provided as well as the annotation type that indicates a method should be* invoked asynchronously. If no annotation type is specified, this post-* processor will detect both Spring's {@link Async @Async} annotation as well* as the EJB 3.1 {@code javax.ejb.Asynchronous} annotation.** <p>For methods having a {@code void} return type, any exception thrown* during the asynchronous method invocation cannot be accessed by the* caller. An {@link AsyncUncaughtExceptionHandler} can be specified to handle* these cases.** <p>Note: The underlying async advisor applies before existing advisors by default,* in order to switch to async execution as early as possible in the invocation chain.** @author Mark Fisher* @author Juergen Hoeller* @author Stephane Nicoll* @since 3.0* @see Async* @see AsyncAnnotationAdvisor* @see #setBeforeExistingAdvisors* @see ScheduledAnnotationBeanPostProcessor*/
@SuppressWarnings("serial")
public class AsyncAnnotationBeanPostProcessor extends AbstractBeanFactoryAwareAdvisingPostProcessor {/*** The default name of the {@link TaskExecutor} bean to pick up: "taskExecutor".* <p>Note that the initial lookup happens by type; this is just the fallback* in case of multiple executor beans found in the context.* @since 4.2* @see AnnotationAsyncExecutionInterceptor#DEFAULT_TASK_EXECUTOR_BEAN_NAME*/public static final String DEFAULT_TASK_EXECUTOR_BEAN_NAME =AnnotationAsyncExecutionInterceptor.DEFAULT_TASK_EXECUTOR_BEAN_NAME;protected final Log logger = LogFactory.getLog(getClass());@Nullableprivate Class<? extends Annotation> asyncAnnotationType;@Nullableprivate Executor executor;@Nullableprivate AsyncUncaughtExceptionHandler exceptionHandler;public AsyncAnnotationBeanPostProcessor() {setBeforeExistingAdvisors(true);}/*** Set the 'async' annotation type to be detected at either class or method* level. By default, both the {@link Async} annotation and the EJB 3.1* {@code javax.ejb.Asynchronous} annotation will be detected.* <p>This setter property exists so that developers can provide their own* (non-Spring-specific) annotation type to indicate that a method (or all* methods of a given class) should be invoked asynchronously.* @param asyncAnnotationType the desired annotation type*/public void setAsyncAnnotationType(Class<? extends Annotation> asyncAnnotationType) {Assert.notNull(asyncAnnotationType, "'asyncAnnotationType' must not be null");this.asyncAnnotationType = asyncAnnotationType;}/*** Set the {@link Executor} to use when invoking methods asynchronously.* <p>If not specified, default executor resolution will apply: searching for a* unique {@link TaskExecutor} bean in the context, or for an {@link Executor}* bean named "taskExecutor" otherwise. If neither of the two is resolvable,* a local default executor will be created within the interceptor.* @see AsyncAnnotationAdvisor#AsyncAnnotationAdvisor(Executor, AsyncUncaughtExceptionHandler)* @see AnnotationAsyncExecutionInterceptor#getDefaultExecutor(BeanFactory)* @see #DEFAULT_TASK_EXECUTOR_BEAN_NAME*/public void setExecutor(Executor executor) {this.executor = executor;}/*** Set the {@link AsyncUncaughtExceptionHandler} to use to handle uncaught* exceptions thrown by asynchronous method executions.* @since 4.1*/public void setExceptionHandler(AsyncUncaughtExceptionHandler exceptionHandler) {this.exceptionHandler = exceptionHandler;}@Overridepublic void setBeanFactory(BeanFactory beanFactory) {super.setBeanFactory(beanFactory);// 重点就是这个 AsyncAnnotationAdvisorAsyncAnnotationAdvisor advisor = new AsyncAnnotationAdvisor(this.executor, this.exceptionHandler);if (this.asyncAnnotationType != null) {advisor.setAsyncAnnotationType(this.asyncAnnotationType);}advisor.setBeanFactory(beanFactory);this.advisor = advisor;}}

setAsyncAnnotationType setExecutor setExceptionHandler 这三个方法,看过前面文章的都知道是干嘛的了。这里再啰嗦下:

  • setAsyncAnnotationType 方法,给成员变量 asyncAnnotationType 赋值,其值来自 @EnableAsyncannotation 属性的值。
  • setExecutor 方法,给成员变量 executor 赋值,其值来自 AsyncConfigurergetAsyncExecutor 方法的返回值。
  • setExceptionHandler 方法,给成员变量 exceptionHandler 赋值,其值来自 AsyncConfigurergetAsyncUncaughtExceptionHandler 方法的返回值。

重点是 setBeanFactory 这个方法,它里边的核心就是创建了一个 AsyncAnnotationAdvisor ,看这名字就知道转入AOP相关的知识了。
至此,重点就转移到 AsyncAnnotationAdvisor 这个类了,下一篇文章我们来分析它。

http://www.xdnf.cn/news/26839.html

相关文章:

  • 系统思考:危机中的转型机遇
  • STM32单片机入门学习——第43节: [12-3] 读写备份寄存器实时时钟
  • STM32 外部中断EXTI
  • 爬虫入门与requests库的使用——python爬虫
  • XCVU13P-2FHGA2104I Xilinx Virtex UltraScale+ FPGA
  • 额外篇 非递归之美:归并排序与快速排序的创新实现
  • 解决 IntelliJ IDEA 项目启动时端口冲突问题
  • Linux网络编程——基于ET模式下的Reactor
  • 使用 Vite 快速搭建现代化 React 开发环境
  • 考公:数字推理
  • 新能源汽车动力电池热管理方案全解析:开启电车续航与安全的密码
  • 『Linux_网络』 第二章 UDP_Socket编程
  • 可发1区的超级创新思路(python 、MATLAB实现):基于多尺度注意力TCN-KAN与小波变换的时间序列预测模型
  • webpack 中 chunks详解
  • MATLAB 控制系统设计与仿真 - 38
  • C++问题,忘记为类添加拷贝构造函数和赋值运算符重载
  • 动态规划算法的欢乐密码(一):斐波那契数模型
  • QT采用cmake编译时文件解析
  • 基于大语言模型的自动化单元测试生成系统及测试套件评估方法
  • 在Windows创建虚拟环境如何在pycharm中配置使用
  • 游戏引擎学习第236天:GPU 概念概述
  • 交换网络基础
  • JDOM处理XML:Java程序员的“乐高积木2.0版“
  • 【大模型】 LangChain框架 -LangChain用例
  • kafka的零拷贝技术
  • 数据结构——栈以及相应的操作
  • MAUI项目iOS应用以进 App Store 分发
  • Leakcanary框架分析:他是如何检测内存泄漏的?四大引用;Heap Dump的实现,设计原则
  • Windows进程管理
  • 宇树机器狗go2—slam建图(1)点云格式