BeanFactoryPostProcessor接口,對BeanFactory進行后置方法調用
BeanFactoryPostProcessor分為兩組:BeanDefinitionRegistryPostProcessor 注冊器和 BeanFactoryPostProcessor 規則處理器
(先執行完所有注冊器, 最后才執行規則處理器)
功能:
1、實現注冊器接口方法,將自定義bean注冊到beanFactory中
2、實現規則處理器,在所有注冊器處理完成后,對BeanFactory進行擴展。
如Mybatis的dao接口bean的注冊,就是通過實現這個注冊器接口
public class MapperScannerConfigurer implements BeanDefinitionRegistryPostProcessor, InitializingBean, ApplicationContextAware, BeanNameAware
觸發時間:
ApplicationPreparedEvent 上下文准備完成后
refreshContext()方法中調用 invokeBeanFactoryPostProcessors(beanFactory)
BeanDefinitionRegistryPostProcessor : 注冊器:
SharedMetadataReaderFactoryContextInitializer
ConfigurationWarningsApplicationContextInitializer
ConfigurationClassPostProcessor(重點)
BeanFactoryPostProcessor 規則處理器:
ConfigFileApplicationListener # PropertySourceOrderingPostProcessor
執行流程:
Spring對我們自定義Bean的解析也是通過BeanDefinitionRegistryPostProcessor接口 實現類ConfigurationClassPostProcessor來進行掃描和注冊bean定義 執行過程是: 1、先將上下文ApplicationContext的beanFactoryPostProcessors列表轉換成 BeanDefinitionRegistryPostProcessor(registryProcessors 注冊處理器) 和BeanFactoryPostProcessor(regularPostProcessors規則處理器) 2、首先會執行 registryProcessors 注冊處理器的postProcessBeanDefinitionRegistry(registry)方法進行自定義bean定義的注冊 第一次執行注冊 會獲取BeanFactory中內置的BeanDefinitionRegistryPostProcessor接口實現類, 並且這個類要實現PriorityOrdered接口==》ConfigurationClassPostProcessor 會調用ConfigurationClassPostProcessor類的注冊方法掃描和注冊所有bean定義。 第二次執行注冊: 會獲取BeanFactory中掃描后獲取的BeanDefinitionRegistryPostProcessor接口實現類, 並且這個類要實現Ordered接口 調用注冊方法 第三次執行注冊: 一樣獲取BeanDefinitionRegistryPostProcessor接口實現,除了上面之外的實現類進行執行注冊 比如mybatis相關的bean注冊就是在第三次進行注冊(MapperScannerConfigurer) 3、當執行完注冊操作后,會將上面的BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor接口實現類 調用接口方法postProcessor.postProcessBeanFactory(beanFactory),處理beanFactory的后置操作