:::success 注册代码的位置
    spring-web | org.springframework.web.context.ContextLoader
    上下文配置 configureAndRefreshWebApplicationContext
    这块注册的扩展是优先执行的。 :::

    执行优先级最高的 BeanFactoryPostProcessor
    这个阶段的处理的是我们在configureAndRefreshWebApplicationContext # customizeContext(sc, wac)
    这个阶段注册的BeanDefinitionRegistryPostProcessor处理器。比如我们可以通过如下的方式注册自定义处理器:
    1. 执行最先注册的 BeanDefinitionRegistryPostProcessor - 图1

    过程部分源码:找到 BeanDefinitionRegistryPostProcessor 然后执行,其余的记录下来。

    1. // Invoke BeanDefinitionRegistryPostProcessors first, if any.
    2. Set<String> processedBeans = new HashSet<>();
    3. // 1.判断是否为BeanDefinitionRegistry的子类,默认情况下我们的工厂类为DefaultListableBeanFactory所以会进这个分支
    4. if (beanFactory instanceof BeanDefinitionRegistry) {
    5. BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
    6. // 优先处理BeanDefinitionRegistryPostProcessor,不是的先记录下来
    7. List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
    8. List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
    9. // 遍历处理器
    10. for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
    11. if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
    12. BeanDefinitionRegistryPostProcessor registryProcessor =
    13. (BeanDefinitionRegistryPostProcessor) postProcessor;
    14. // 2.执行BeanDefinitionRegistryPostProcessor的方法,并记录下该Processor
    15. registryProcessor.postProcessBeanDefinitionRegistry(registry);
    16. registryProcessors.add(registryProcessor);
    17. }
    18. else {
    19. // 记录下其他的postProcessor
    20. regularPostProcessors.add(postProcessor);
    21. }
    22. }
    23. ......
    1. 首先判断我们的 BeanFactory 是否为 BeanDefinitionRegistry ,默认情况下我们的 BeanFactory 为 DefaultListableBeanFactory 满足条件;如果不是的话,那么直接执行扩展;

      1. private static void invokeBeanFactoryPostProcessors(
      2. Collection<? extends BeanFactoryPostProcessor> postProcessors
      3. , ConfigurableListableBeanFactory beanFactory) {
      4. for (BeanFactoryPostProcessor postProcessor : postProcessors) {
      5. postProcessor.postProcessBeanFactory(beanFactory);
      6. }
      7. }
    2. 接下来找出 BeanDefinitionRegistryPostProcessor 实例的扩展类,执行扩展方法并记录下该扩展类;

    3. 然后记录下其余的扩展类;