spring框架中的@Async使用以及原理浅析 (2)

文章目录简介应用启动构造业务类异步方法执行简介在上篇文章spring框架中的@Async使用以及原理浅析 (1),我们介绍了@Async注解的使用方式,本文将介绍其实现原理,大致分为3块:应用启动时。构造业务类时。异步方法执行时。应用启动首先,要使用@Async,必须先用@EnableAsyc@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(AsyncConfiguratio
摘要由CSDN通过智能技术生成

简介

在上篇文章spring框架中的@Async使用以及原理浅析 (1),我们介绍了@Async注解的使用方式,本文将介绍其实现原理,大致分为3块:

  • 应用启动时。
  • 构造业务类时。
  • 异步方法执行时。

在这里插入图片描述

应用启动

首先,要使用@Async,必须先用@EnableAsyc

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AsyncConfigurationSelector.class)
public @interface EnableAsync {
   

	/**
	 * 这里可以自定义使方法异步化的注解,一般我们直接用@Async就行
	 */
	Class<? extends Annotation> annotation() default Annotation.class;
	
	/**
	 * 实现异步代理的切面模式,一种是jdk动态代理(默认使用),一种是ASPECJ
	 */
	AdviceMode mode() default AdviceMode.PROXY;
}

其引入了AsyncConfigurationSelector,这是一个选择器,根据@EnableAsync中的mode来决定使用哪种异步配置。由于使用我们的配置是AdviceMode.PROXY,所以这里返回ProxyAsyncConfiguration的名称,表示后续会构建ProxyAsyncConfiguration

public class AsyncConfigurationSelector extends AdviceModeImportSelector<EnableAsync> {
   

	private static final String ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME =
			"org.springframework.scheduling.aspectj.AspectJAsyncConfiguration";
			
	@Override
	public String[] selectImports(AdviceMode adviceMode) {
   
		switch (adviceMode) {
   
			case PROXY:
				return new String[] {
    ProxyAsyncConfiguration.class.getName() }; // 走的这
			case ASPECTJ:
				return new String[] {
    ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME };
			default:
				return null;
		}
	}
}

@Configuration
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public class ProxyAsyncConfiguration extends AbstractAsyncConfiguration {
   
	protected Executor executor; // 继承自AbstractAsyncConfiguration

	protected AsyncUncaughtExceptionHandler exceptionHandler; // 继承自AbstractAsyncConfiguration

	@Bean(name = TaskManagementConfigUtils.ASYNC_ANNOTATION_PROCESSOR_BEAN_NAME)   
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	public AsyncAnnotationBeanPostProcessor asyncAdvisor() {
   
		Assert.notNull(this.enableAsync, "@EnableAsync annotation metadata was not injected");
		AsyncAnnotationBeanPostProcessor bpp = new AsyncAnnotationBeanPostProcessor();
		Class<? extends Annotation> customAsyncAnnotation = this.enableAsync.getClass("annotation");
		if (customAsyncAnnotation != AnnotationUtils.getDefaultValue(EnableAsync.class, "annotation")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值