ConfigurationClassPostProcessors 是处理配置类的处理器,前面已经知道它是在初始化 AnnotationConfigApplicationContext 时添加到 BeanFactory 中,并且作为一个 BeanDenifitionRegistryPostProcessor 在 AbstractApplicationContext 的 refresh 方法中被调用。接下来继续分析 ConfigurationClassPostProcessor 如何处理配置类,目前理解的主要流程如下。
- 在 bean factory 中查找已经添加的配置类 (在以 Servlet 项目为例子时,只有启动类需要解析)
- 对上一步的configClass进行排序。
- 利用 ConfigurationClassParser 解析配置类(解析该配置类上的其他注解)。
- 调用 doProcessConfigurationClass 方法解析配置类
- 如果成员类也是配置类,则先解析成员类
- 处理配置类上的显示或隐式的 @PropertySources 和 @PropertySource 注解
- 处理配置类上显示或隐式的 @ComponentScans 和 @ComponentScan 注解,解析与其相关的配置类
- 处理 @Import 注解,查找配置类上显示和隐式的 @Import 注解,保存注解的 value 值
- 处理 @ImportResource 注解
- 为配置类添加带 @Bean 注解的方法
- 查找接口中带 @Bean 注解的方法
- 如果父类也是配置类,则解析父类
- 处理 DeferredImportSelector
- 将上一步解析出来的新配置类通过 loadBeanDefinitions 添加到 bean factory 中。
- 如果 bean factory 中有还没有解析的配置类,重复第3步。
有 @Configuration、@Import 、 @Component、@ComponentScan 以及 @ImportResource 这几个注解的类都是配置类,都会对其进行上面的处理。除了 @Configuration 注解只标识为配置类之外,另外几个注解都有各自的作用,在配置类处理过程中会根据这些注解的参数进行处理。