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对象