最近看到,大部分文章都是在講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返回如下

之后,在第一次獲取到的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的位置,如下圖所示

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