EnableAsync原理(原创)

1、EnableMyAsync里面有@Import(MyAsyncConfigurationSelector.class)
2、MyAsyncConfigurationSelector根据条件选择代理配置,ProxyAsyncConfiguration为其中一种

生成AsyncAnnotationBeanPostProcessor 对象,并放入容器
3-1、ProxyAsyncConfiguration有@Bean注解的方法- AsyncAnnotationBeanPostProcessor asyncAdvisor(),生成AsyncAnnotationBeanPostProcessor 对象
3-2、ProxyAsyncConfiguration的父类AbstractAsyncConfiguration,方法setConfigurers中注入configurers对象,从中获取executor对象
3-3、AsyncDefaultAutoConfiguration对象是一个条件配置类,@ConditionalOnProperty(value = "spring.sleuth.async.enabled", matchIfMissing = true)说明默认是生效的,会提供一个实现了AsyncConfigurer接口的
DefaultAsyncConfigurerSupport对象,接口方法getAsyncExecutor返回的是new SimpleAsyncTaskExecutor()的代理类LazyTraceExecutor

接3-1
把Async注解与异步执行串起来:
4-1、AsyncAnnotationBeanPostProcessor里有setBeanFactory方法,里面指定了AsyncAnnotationAdvisor对象为注解增强器对象
4-2、AsyncAnnotationAdvisor的构造方法中,指定了Async注解为想要增强的注解,并调用buildPointcut方法生成与注解匹配的Pointcut对象;同时会调用buildAdvice生成Advice对象
4-3、buildAdvice生成的Advice对象是AnnotationAsyncExecutionInterceptor实例,其父类为AsyncExecutionInterceptor,实现了接口MethodInterceptor的invoke方法,会把原来的代码封装成一个任务交给executor对象来异步执行

把程序启动与bean生成代理类对象串起来:
5-1、AsyncAnnotationBeanPostProcessor父类的父类- AbstractAdvisingBeanPostProcessor,实现了BeanPostProcessor接口的postProcessAfterInitialization,在对象实例化之后的处理,如果对象的类实现了Advised接口或者对象的方法有需要增强,则会生成一个代理类对象返回,否则返回原对象

你可能感兴趣的:(EnableAsync原理(原创))