天天看點

SpringBoot擴充接口- BeanFactoryPostProcessor後置處理器

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

繼續閱讀