Spring 中 BeanFactoryPostProcessor的加載

最近看到,大部分文章都是在講BeanFactoryPostProcessor的使用,而對其加載過程閉口不談,

一句在invokeBeanFactoryPostProcessors(beanFactory) 中調(diào)用了全部的BeanFactoryPostProcessor就結(jié)束了

但是其實(shí)有沒有考慮過一點(diǎn),refresh方法中,進(jìn)行到invokeBeanFactoryPostProcessor的時候,除了在 obtainFreshBeanFactory讀取的Bean以外,實(shí)際上還沒有進(jìn)行任何Bean的加載,那這里是在哪里加載的呢


先直接說結(jié)論,通過debug,發(fā)現(xiàn)Spring由系統(tǒng)在prepareBeanFactory(beanFactory)先行內(nèi)置了BeanFactoryPostProcessor,最后通過org.springframework.context.annotation.ConfigurationClassParser讀取的BeanFactoryPostProcessor,將@Component 修飾的 BeanFactoryPostProcessor加載進(jìn)入容器


invokeBeanFactoryPostProcessors,其中getBeanFactoryPostProcessors返回如下

image.png

之后,在第一次獲取到的ProcessorNames的代碼及得到的對象如下

// 根據(jù)類型讀取,得到`org.springframework.context.annotation.internalConfigurationAnnotationProcessor`
            String[] postProcessorNames =
                    beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
            for (String ppName : postProcessorNames) {
                if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                    // 獲取的為 ConfigurationClassPostProcessor
                    currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    processedBeans.add(ppName);
                }
            }

此處的 ConfigurationClassPostProcessor,進(jìn)行了@Configuration@Bean的處理,

之后,我們可以在ConfigurationClassParser中發(fā)現(xiàn)具體的加載BeanFactoryPostProcessor的位置,如下圖所示

image.png

最后,在invokeBeanFactoryPostProcessors(beanFactory)的最后,從容器中取出所有剩余的BeanFactoryPostProcessor的類,進(jìn)行處理

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容