spring源码学习笔记之BeanFactoryPostProcessor(六)

 2023-02-10
原文作者:_宁缺 原文地址:https://juejin.cn/post/7007575295263768613

接下来我们看看 invokeBeanFactoryPostProcessors方法

    // 调用各种beanFactory处理器
    invokeBeanFactoryPostProcessors(beanFactory);

BeanFactoryPostProcessor 是 BeanFactory 的后置处理器,用来对 BeanFactory 做增强或者修改操作。
可以看看断点到 invokeBeanFactoryPostProcessors(beanFactory) 方法的时候,beanFactory属性的内容:

202301012126026441.png

拿一个实现了 BeanFactoryPostProcessor 接口的类来看看,比如PlaceholderConfigurerSupport

202301012126034202.png PlaceholderConfigurerSupport是用来处理bean definition中的占位符的。
Abstract base class for property resource configurers that resolve placeholders in bean definition property values.

处理过程:

    /**
     * 使用指定的字符串值解析器处理从起中所有的bean定义属性
     *
     * @param beanFactoryToProcess 要处理的bean定义所属的容器
     * @param valueResolver 属性值解析器
     */
    protected void doProcessProperties(ConfigurableListableBeanFactory beanFactoryToProcess,
          StringValueResolver valueResolver) {
       // 使用指定的字符串值解析器 valueResolver 定义一个bean定义访问器,
       // 该访问器的目的就是每次访问一个bean定义,将其中所有可能包含占位符的属性值,包括bean属性值,
       // bean构造函数参数值,双亲bean名称,bean类名,bean工厂bean名称,bean工厂方法名称,作用域
       // 等都遍历一遍,进行需要的占位符解析
       BeanDefinitionVisitor visitor = new BeanDefinitionVisitor(valueResolver);
    
       // 获取容器中所有bean的名称
       String[] beanNames = beanFactoryToProcess.getBeanDefinitionNames();
       // 遍历bean定义进行属性值占位符解析
       for (String curName : beanNames) {
          // Check that we're not parsing our own bean definition,
          // to avoid failing on unresolvable placeholders in properties file locations.
          // 检查当前bean的名称不等于被处理的bean的名称并且要处理的容器是自己所在的容器
          if (!(curName.equals(this.beanName) && beanFactoryToProcess.equals(this.beanFactory))) {
             BeanDefinition bd = beanFactoryToProcess.getBeanDefinition(curName);
             try {
                // 对bean定义bd进行属性值占位符解析
                visitor.visitBeanDefinition(bd);
             }
             catch (Exception ex) {
                throw new BeanDefinitionStoreException(bd.getResourceDescription(), curName, ex.getMessage(), ex);
             }
          }
       }
    
       // New in Spring 2.5: resolve placeholders in alias target names and aliases as well.
       // 处理别名中的占位符
       beanFactoryToProcess.resolveAliases(valueResolver);
    
       // New in Spring 3.0: resolve placeholders in embedded values such as annotation attributes.
       // 设置占位符处理器为内置的值处理器
       beanFactoryToProcess.addEmbeddedValueResolver(valueResolver);
    }

如果想修改 beanFactory 中的一些属性的值的时候,就可以定义一个实现了 BeanFactoryPostProcessor 接口的子类,在子类中就可以对 beanFactory 做任何想要的修改。

我们还需要了解 BeanFactoryPostProcessor 的子接口 BeanDefinitionRegistryPostProcessorBeanDefinitionRegistryPostProcessor接口的方法就 postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry):

    void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

BeanDefinitionRegistry 组要是用来对 BeanDefinition 做增删改查操作:

202301012126039083.png 前面我们知道 beanFactory 中有两个属性:

  • BeanDefinitionMap
  • BeanDefinitionNames

BeanDefinitionRegistry就是处理这些 BeanDefinition的。

    /**
     * 实例化并且调用所有已经注册了的beanFactoryPostProcessor,遵循指明的顺序
     *
     * Instantiate and invoke all registered BeanFactoryPostProcessor beans,
     * respecting explicit order if given.
     * <p>Must be called before singleton instantiation.
     */
    protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
       // 获取到当前应用程序上下文的beanFactoryPostProcessors变量的值,并且实例化调用执行所有已经注册的beanFactoryPostProcessor
       // 默认情况下,通过getBeanFactoryPostProcessors()来获取已经注册的BFPP,但是默认是空的,那么问题来了,如果你想扩展,怎么进行扩展工作?
       PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
    
       // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
       // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
       if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
          beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
          beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
       }
    }

默认情况下,通过getBeanFactoryPostProcessors()来获取已经注册的BFPP,但是默认是空的,如果想要扩展,可以自定义一个类,实现 BeanFactoryPostProcessor。

主要的处理逻辑在 invokeBeanFactoryPostProcessors方法调用:

    public static void invokeBeanFactoryPostProcessors(
                ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
    
            // Invoke BeanDefinitionRegistryPostProcessors first, if any.
            // 无论是什么情况,优先执行BeanDefinitionRegistryPostProcessors
            // 将已经执行过的BFPP存储在processedBeans中,防止重复执行
            Set<String> processedBeans = new HashSet<>();
    
            // 判断beanfactory是否是BeanDefinitionRegistry类型,此处是DefaultListableBeanFactory,实现了BeanDefinitionRegistry接口,所以为true
            if (beanFactory instanceof BeanDefinitionRegistry) {
                // 类型转换
                BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
                // 此处希望大家做一个区分,两个接口是不同的,BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子集
                // BeanFactoryPostProcessor主要针对的操作对象是BeanFactory,而BeanDefinitionRegistryPostProcessor主要针对的操作对象是BeanDefinition
                // 存放BeanFactoryPostProcessor的集合
                List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
                // 存放BeanDefinitionRegistryPostProcessor的集合
                List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
    
                // 首先处理入参中的beanFactoryPostProcessors,遍历所有的beanFactoryPostProcessors,将BeanDefinitionRegistryPostProcessor
                // 和BeanFactoryPostProcessor区分开
                for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
                    // 如果是BeanDefinitionRegistryPostProcessor
                    if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
                        BeanDefinitionRegistryPostProcessor registryProcessor =
                                (BeanDefinitionRegistryPostProcessor) postProcessor;
                        // 直接执行BeanDefinitionRegistryPostProcessor接口中的postProcessBeanDefinitionRegistry方法
                        registryProcessor.postProcessBeanDefinitionRegistry(registry);
                        // 添加到registryProcessors,用于后续执行postProcessBeanFactory方法
                        registryProcessors.add(registryProcessor);
                    } else {
                        // 否则,只是普通的BeanFactoryPostProcessor,添加到regularPostProcessors,用于后续执行postProcessBeanFactory方法
                        regularPostProcessors.add(postProcessor);
                    }
                }
    
                // Do not initialize FactoryBeans here: We need to leave all regular beans
                // uninitialized to let the bean factory post-processors apply to them!
                // Separate between BeanDefinitionRegistryPostProcessors that implement
                // PriorityOrdered, Ordered, and the rest.
                // 用于保存本次要执行的BeanDefinitionRegistryPostProcessor
                List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
    
                // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
                // 调用所有实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor实现类
                // 找到所有实现BeanDefinitionRegistryPostProcessor接口bean的beanName
                String[] postProcessorNames =
                        beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                // 遍历处理所有符合规则的postProcessorNames
                for (String ppName : postProcessorNames) {
                    // 检测是否实现了PriorityOrdered接口
                    if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                        // 获取名字对应的bean实例,添加到currentRegistryProcessors中
                        currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                        // 将要被执行的BFPP名称添加到processedBeans,避免后续重复执行
                        processedBeans.add(ppName);
                    }
                }
                // 按照优先级进行排序操作
                sortPostProcessors(currentRegistryProcessors, beanFactory);
                // 添加到registryProcessors中,用于最后执行postProcessBeanFactory方法
                registryProcessors.addAll(currentRegistryProcessors);
                // 遍历currentRegistryProcessors,执行postProcessBeanDefinitionRegistry方法
                invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
                // 执行完毕之后,清空currentRegistryProcessors
                currentRegistryProcessors.clear();
    
                // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
                // 调用所有实现Ordered接口的BeanDefinitionRegistryPostProcessor实现类
                // 找到所有实现BeanDefinitionRegistryPostProcessor接口bean的beanName,
                // 此处需要重复查找的原因在于上面的执行过程中可能会新增其他的BeanDefinitionRegistryPostProcessor
                postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                for (String ppName : postProcessorNames) {
                    // 检测是否实现了Ordered接口,并且还未执行过
                    if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
                        // 获取名字对应的bean实例,添加到currentRegistryProcessors中
                        currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                        // 将要被执行的BFPP名称添加到processedBeans,避免后续重复执行
                        processedBeans.add(ppName);
                    }
                }
                // 按照优先级进行排序操作
                sortPostProcessors(currentRegistryProcessors, beanFactory);
                // 添加到registryProcessors中,用于最后执行postProcessBeanFactory方法
                registryProcessors.addAll(currentRegistryProcessors);
                // 遍历currentRegistryProcessors,执行postProcessBeanDefinitionRegistry方法
                invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
                // 执行完毕之后,清空currentRegistryProcessors
                currentRegistryProcessors.clear();
    
                // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
                // 最后,调用所有剩下的BeanDefinitionRegistryPostProcessors
                boolean reiterate = true;
                while (reiterate) {
                    reiterate = false;
                    // 找出所有实现BeanDefinitionRegistryPostProcessor接口的类
                    postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                    // 遍历执行
                    for (String ppName : postProcessorNames) {
                        // 跳过已经执行过的BeanDefinitionRegistryPostProcessor
                        if (!processedBeans.contains(ppName)) {
                            // 获取名字对应的bean实例,添加到currentRegistryProcessors中
                            currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                            // 将要被执行的BFPP名称添加到processedBeans,避免后续重复执行
                            processedBeans.add(ppName);
                            reiterate = true;
                        }
                    }
                    // 按照优先级进行排序操作
                    sortPostProcessors(currentRegistryProcessors, beanFactory);
                    // 添加到registryProcessors中,用于最后执行postProcessBeanFactory方法
                    registryProcessors.addAll(currentRegistryProcessors);
                    // 遍历currentRegistryProcessors,执行postProcessBeanDefinitionRegistry方法
                    invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
                    // 执行完毕之后,清空currentRegistryProcessors
                    currentRegistryProcessors.clear();
                }
    
                // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
                // 调用所有BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法
                invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
                // 最后,调用入参beanFactoryPostProcessors中的普通BeanFactoryPostProcessor的postProcessBeanFactory方法
                invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
            } else {
                // Invoke factory processors registered with the context instance.
                // 如果beanFactory不归属于BeanDefinitionRegistry类型,那么直接执行postProcessBeanFactory方法
                invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
            }
    
            // 到这里为止,入参beanFactoryPostProcessors和容器中的所有BeanDefinitionRegistryPostProcessor已经全部处理完毕,下面开始处理容器中
            // 所有的BeanFactoryPostProcessor
            // 可能会包含一些实现类,只实现了BeanFactoryPostProcessor,并没有实现BeanDefinitionRegistryPostProcessor接口
    
            // Do not initialize FactoryBeans here: We need to leave all regular beans
            // uninitialized to let the bean factory post-processors apply to them!
            // 找到所有实现BeanFactoryPostProcessor接口的类
            String[] postProcessorNames =
                    beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
    
            // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
            // Ordered, and the rest.
            // 用于存放实现了PriorityOrdered接口的BeanFactoryPostProcessor
            List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
            // 用于存放实现了Ordered接口的BeanFactoryPostProcessor的beanName
    //    List<String> orderedPostProcessorNames = new ArrayList<>();
            List<BeanFactoryPostProcessor> orderedPostProcessor = new ArrayList<>();
            // 用于存放普通BeanFactoryPostProcessor的beanName
    //    List<String> nonOrderedPostProcessorNames = new ArrayList<>();
            List<BeanFactoryPostProcessor> nonOrderedPostProcessorNames = new ArrayList<>();
            // 遍历postProcessorNames,将BeanFactoryPostProcessor按实现PriorityOrdered、实现Ordered接口、普通三种区分开
            for (String ppName : postProcessorNames) {
                // 跳过已经执行过的BeanFactoryPostProcessor
                if (processedBeans.contains(ppName)) {
                    // skip - already processed in first phase above
                }
                // 添加实现了PriorityOrdered接口的BeanFactoryPostProcessor到priorityOrderedPostProcessors
                else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                    priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
                }
                // 添加实现了Ordered接口的BeanFactoryPostProcessor的beanName到orderedPostProcessorNames
                else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
    //          orderedPostProcessorNames.add(ppName);
                    orderedPostProcessor.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
                } else {
                    // 添加剩下的普通BeanFactoryPostProcessor的beanName到nonOrderedPostProcessorNames
    //          nonOrderedPostProcessorNames.add(ppName);
                    nonOrderedPostProcessorNames.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
                }
            }
    
            // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
            // 对实现了PriorityOrdered接口的BeanFactoryPostProcessor进行排序
            sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
            // 遍历实现了PriorityOrdered接口的BeanFactoryPostProcessor,执行postProcessBeanFactory方法
            invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
    
            // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
            // 创建存放实现了Ordered接口的BeanFactoryPostProcessor集合
    //    List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
            // 遍历存放实现了Ordered接口的BeanFactoryPostProcessor名字的集合
    //    for (String postProcessorName : orderedPostProcessorNames) {
            // 将实现了Ordered接口的BeanFactoryPostProcessor添加到集合中
    //       orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    //    }
            // 对实现了Ordered接口的BeanFactoryPostProcessor进行排序操作
    //    sortPostProcessors(orderedPostProcessors, beanFactory);
            sortPostProcessors(orderedPostProcessor, beanFactory);
            // 遍历实现了Ordered接口的BeanFactoryPostProcessor,执行postProcessBeanFactory方法
    //    invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
            invokeBeanFactoryPostProcessors(orderedPostProcessor, beanFactory);
    
            // Finally, invoke all other BeanFactoryPostProcessors.
            // 最后,创建存放普通的BeanFactoryPostProcessor的集合
    //    List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
            // 遍历存放实现了普通BeanFactoryPostProcessor名字的集合
    //    for (String postProcessorName : nonOrderedPostProcessorNames) {
            // 将普通的BeanFactoryPostProcessor添加到集合中
    //       nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    //    }
            // 遍历普通的BeanFactoryPostProcessor,执行postProcessBeanFactory方法
    //    invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
            invokeBeanFactoryPostProcessors(nonOrderedPostProcessorNames, beanFactory);
    
            // Clear cached merged bean definitions since the post-processors might have
            // modified the original metadata, e.g. replacing placeholders in values...
            // 清除元数据缓存(mergeBeanDefinitions、allBeanNamesByType、singletonBeanNameByType)
            // 因为后置处理器可能已经修改了原始元数据,例如,替换值中的占位符
            beanFactory.clearMetadataCache();
        }