1. 程式人生 > >Spring註解解析之ConfigurationClassPostProcessor

Spring註解解析之ConfigurationClassPostProcessor

概述

Spring中有各種註解,比如@Configuration、@Import、@ComponentScan、@Autowired等等,那Spring是怎麼識別和解析這些註解的呢。是通過BeanFactoryPostProcessor和BeanPostProcessor這兩種擴充套件的機制來實現解析和識別的。那麼我們來認識下這些處理註解的各種BeanFactoryPostProcessor和BeanPostProcessor,包括:

  • ConfigurationClassPostProcessor
  • AutowiredAnnotationBeanPostProcessor
  • RequiredAnnotationBeanPostProcessor
  • CommonAnnotationBeanPostProcessor
  • PersistenceAnnotationBeanPostProcessor

它們都是通過方法AnnotationConfigUtils#registerAnnotationConfigProcessors()向容器中註冊的,因此我們可以得出這麼一個結論,無論是通過SpringBoot、xml檔案的<context:/>擴充套件標籤還是純JavaConfig形式的標準應用,最終底層都會呼叫這個方法向容器註冊這些BeanFactoryPostProcessor和BeanPostProcessor的,這樣才能識別這些註解起到配置的作用。

ConfigurationClassPostProcessor

ConfigurationClassPostProcessor會處理所有BeanDefinition中的符合註解條件的BeanDefinition,(@Configuration註解的、@Component、@ComponentScan、@Import、@ImportResource或者@Bean註解的),使用ConfigurationClassParser解析出javaconfig配置類,使用ConfigurationClassBeanDefinitionReader載入。

PS:ConfigurationClassPostProcessor是對所有註冊到Spring容器中的BeanDefinition進行處理,是已經註冊的是關鍵,不管是手動註冊還是掃描機制。

1、過濾出帶有相關注解的BeanDefinition
對所有BeanDefinition進行篩查,符合條件的是帶有註解@Configuration、@Component、@ComponentScan、@Import、@ImportResource或者@Bean註解的。

2、對第一步的候選類進一步