最近看到,大部分文章都是在讲BeanFactoryPostProcessor的使用,而对其加载过程闭口不谈,
一句在invokeBeanFactoryPostProcessors(beanFactory) 中调用了全部的BeanFactoryPostProcessor就结束了
但是其实有没有考虑过一点,refresh方法中,进行到invokeBeanFactoryPostProcessor的时候,除了在 obtainFreshBeanFactory读取的Bean以外,实际上还没有进行任何Bean的加载,那这里是在哪里加载的呢
先直接说结论,通过debug,发现Spring由系统在prepareBeanFactory(beanFactory)先行内置了BeanFactoryPostProcessor,最后通过org.springframework.context.annotation.ConfigurationClassParser读取的BeanFactoryPostProcessor,将@Component 修饰的 BeanFactoryPostProcessor加载进入容器
在invokeBeanFactoryPostProcessors,其中getBeanFactoryPostProcessors返回如下

之后,在第一次获取到的ProcessorNames的代码及得到的对象如下
// 根据类型读取,得到`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,进行了@Configuration和@Bean的处理,
之后,我们可以在ConfigurationClassParser中发现具体的加载BeanFactoryPostProcessor的位置,如下图所示

最后,在invokeBeanFactoryPostProcessors(beanFactory)的最后,从容器中取出所有剩余的BeanFactoryPostProcessor的类,进行处理
