:::success
注册代码的位置
spring-web | org.springframework.web.context.ContextLoader
上下文配置 configureAndRefreshWebApplicationContext
这块注册的扩展是优先执行的。
:::
执行优先级最高的 BeanFactoryPostProcessor
这个阶段的处理的是我们在configureAndRefreshWebApplicationContext # customizeContext(sc, wac)
这个阶段注册的BeanDefinitionRegistryPostProcessor
处理器。比如我们可以通过如下的方式注册自定义处理器:
过程部分源码:找到 BeanDefinitionRegistryPostProcessor 然后执行,其余的记录下来。
// Invoke BeanDefinitionRegistryPostProcessors first, if any.
Set<String> processedBeans = new HashSet<>();
// 1.判断是否为BeanDefinitionRegistry的子类,默认情况下我们的工厂类为DefaultListableBeanFactory所以会进这个分支
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
// 优先处理BeanDefinitionRegistryPostProcessor,不是的先记录下来
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
// 遍历处理器
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
// 2.执行BeanDefinitionRegistryPostProcessor的方法,并记录下该Processor
registryProcessor.postProcessBeanDefinitionRegistry(registry);
registryProcessors.add(registryProcessor);
}
else {
// 记录下其他的postProcessor
regularPostProcessors.add(postProcessor);
}
}
......
首先判断我们的 BeanFactory 是否为 BeanDefinitionRegistry ,默认情况下我们的 BeanFactory 为 DefaultListableBeanFactory 满足条件;如果不是的话,那么直接执行扩展;
private static void invokeBeanFactoryPostProcessors(
Collection<? extends BeanFactoryPostProcessor> postProcessors
, ConfigurableListableBeanFactory beanFactory) {
for (BeanFactoryPostProcessor postProcessor : postProcessors) {
postProcessor.postProcessBeanFactory(beanFactory);
}
}
接下来找出 BeanDefinitionRegistryPostProcessor 实例的扩展类,执行扩展方法并记录下该扩展类;
- 然后记录下其余的扩展类;