前言
在上一篇博文Spring之ConfigurationClassPostProcessor解析流程中,我们重点介绍了@Import注解 。在这篇文章中,我们以@EnableAsync举例说明@Import在Spring中的应用
1.点击@EnableAsync注解 查看@Import注入的类
2.点进去这个类,发现一个很相似的方法selectImports(AdviceMode adviceMode),但是注意这个参数不是AnnotationMetadata,不是ImportSelector的实现方法,是当前类AdviceModeImportSelector的实现方法
3.我们查看其父类,发现了ImportSelector的实现方法最终会调用步骤2的方法,这个方法主要是根据注解上设置的值,来判断是用代理还是用aspectj进行增强,一般会是第一种
4.我们点击查看ProxyAsyncConfiguration这个类,发现有一个enableAsync属性,这个是父类的一个属性。这个属性是怎么赋值的 让我们一探究竟
5.这个配置类实现了ImportAware接口,有一个回调方法,在ConfigurationClassPostProcessor解析流程结束后,会注册一个bean到Spring中。
这个源码在ConfigurationClassPostProcessor#processConfigBeanDefinitions倒数第二个if判断
这个bean是一个bpp,会在AbstractAsyncConfiguration这个对象所属的bd解析成bean的时候调用这个bpp的postProcessBeforeInitialization方法,完成方法回调
源码在ImportAwareBeanPostProcessor#postProcessBeforeInitialization
通过这个回调函数,spring就能获取到用户设置的@EnableAsync属性
6.我们回头再查看ProxyAsyncConfiguration这个类,它有一个@Bean标记的方法,通过步骤5,可以获取@EnableAsync的属性,@Bean标记的方法会实例化一个AsyncAnnotationBeanPostProcessor对象,将@EnableAsync的属性设置进去,然后返回这个对象
总结
@EnableAsync注解最终注入一个类型为AsyncAnnotationBeanPostProcessor的bpp,这个bpp的源码等我完全理解再补上。这里主要以@EnableAsync注解为例子来帮助大家快速理解流程,流程很多都差不多,但是细节需要大家自行去翻阅源码