@Async原理源码-史诗级最强解析

1 如何被代理

1.1 @EnableAsync

主要是import AsyncConfigurationSelector
没有该注解 就不会生成顾问 也不会被代理 @Async就不会生效
在这里插入图片描述

1.2 AsyncConfigurationSelector

栈信息可以看调用链
在这里插入图片描述

触发调用的点
在这里插入图片描述

1.3 ProxyAsyncConfiguration

创建了一个后置处理器 创建的时间点
在这里插入图片描述

1.4 AsyncAnnotationAdvisor*****

AsyncAnnotationBeanPostProcessor
AsyncAnnotationAdvisor
这时就是创建了一个顾问
在这里插入图片描述
在这里插入图片描述

可以看到最重要的是创建了这个顾问 这和事务的一样 后面再bean 初始化后有一个判断是否需要被代理 会循环顾问

1.5 xxxBeanPostProcessor.isEligible()

在这里插入图片描述

1.6 AsyncAnnotationBeanPostProcessor*****

后置处理器 判断是否需要被代理 如果需要就会创建代理对象
在这里插入图片描述

AbstractAdvisingBeanPostProcessor. postProcessAfterInitialization(Object bean, String beanName)
在这里插入图片描述

此时的代理是到类级别的
在这里插入图片描述

如果是代理对象就会cglib代理 如果不是代理对象就走jdk代理

2 拦截器的分析

2.1 JdkDynamicAopProxy.Invoke()

在这里插入图片描述
在这里插入图片描述

2.2 AsyncExecutionInterceptor*****

在这里插入图片描述

2.3 determineAsyncExecutor

AsyncTaskExecutor executor = determineAsyncExecutor(userDeclaredMethod);
如果是第一次 executors(缓存)里面肯定没有
所以根据注解的别名找线程池对象 如果没有就用默认的
在这里插入图片描述
在这里插入图片描述

2.3.1 defaultExecutor

默认的线程池是怎么来的
AsyncExecutionAspectSupport.getDefaultExecutor(@Nullable BeanFactory beanFactory
这里就是获取一个线程池 一般情况下只有一个默认的线程池applicationTaskExecutor
在这里插入图片描述

2.3.2 applicationTaskExecutor

TaskExecutionAutoConfiguration
自动创建了一个名为
“applicationTaskExecutor” 的ThreadPoolTaskExecutor对象
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值