最近看到,大部分文章都是在讲BeanFactoryPostProcessor的使用,而对其加载过程闭口不谈,
一句在invokeBeanFactoryPostProcessors(beanFactory)
中调用了全部的BeanFactoryPostProcessor就结束了
但是其实有没有考虑过一点,refresh方法中,进行到invokeBeanFactoryPostProcessor
的时候,除了在 obtainFreshBeanFactory
读取的Bean以外,实际上还没有进行任何Bean的加载,那这里是在哪里加载的呢
先直接说结论,通过debug,发现Spring由系统在prepareBeanFactory(beanFactory)
先行内置了BeanFactoryPostProcessor
,最后通过org.springframework.context.annotation.ConfigurationClassParser
读取的BeanFactoryPostProcessor
,将@Component
修饰的 BeanFactoryPostProcessor
加载进入容器
在invokeBeanFactoryPostProcessors
,其中getBeanFactoryPostProcessors
返回如下
![](https://img.haomeiwen.com/i7207243/e8ba6e01c911864b.png)
之后,在第一次获取到的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
的位置,如下图所示
![](https://img.haomeiwen.com/i7207243/8c60cf8d4f177ec7.png)
最后,在invokeBeanFactoryPostProcessors(beanFactory)
的最后,从容器中取出所有剩余的BeanFactoryPostProcessor
的类,进行处理
![](https://img.haomeiwen.com/i7207243/647057f86086107a.png)
网友评论