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的後置操作