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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM