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 註解只標識爲配置類之外,另外幾個註解都有各自的作用,在配置類處理過程中會根據這些註解的參數進行處理。