:::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的方法,并记录下该ProcessorregistryProcessor.postProcessBeanDefinitionRegistry(registry);registryProcessors.add(registryProcessor);}else {// 记录下其他的postProcessorregularPostProcessors.add(postProcessor);}}......
首先判断我们的 BeanFactory 是否为 BeanDefinitionRegistry ,默认情况下我们的 BeanFactory 为 DefaultListableBeanFactory 满足条件;如果不是的话,那么直接执行扩展;
private static void invokeBeanFactoryPostProcessors(Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {for (BeanFactoryPostProcessor postProcessor : postProcessors) {postProcessor.postProcessBeanFactory(beanFactory);}}
接下来找出 BeanDefinitionRegistryPostProcessor 实例的扩展类,执行扩展方法并记录下该扩展类;
- 然后记录下其余的扩展类;
