02 Spring 源码总结 - invokeBeanFactoryPostProcessors()

invokeBeanFactoryPostProcessors

/**
实例化并且调用所有已经注册了的beanFactoryPostProcessor,遵循指明的顺序
@param beanFactory 当前应用程序上下文的 BFPP
@param getBeanFactoryPostProcessors()  默认为空,存放拓展的BFPP
*/
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

前置知识

1. BeanFactoryPostProcessor

@FunctionalInterface
public interface BeanFactoryPostProcessor {
	void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
  • BeanFactoryPostProcessor 主要针对的操作对象是 BeanFactory
  • BeanFactory 是一种spring容器它可以用来创建Bean、获取Bean。
  • BeanFactory 将利用 BeanDefinition 生成Bean对象

2. BeanDefinitionRegistryPostProcessor

public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
	void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
}
  • BeanDefinitionRegistryPostProcessor 主要针对的操作对象是 BeanDefinition

  • BeanDefinition 表示 Bean 定义,Spring 根据 BeanDefinition 来创建Bean对象,BeanDefinition 有很多属性来描述 Bean

  • 因为继承关系,实现了 BeanDefinitionRegistryPostProcessor 的类要重写 postProcessBeanFactory()postProcessBeanDefinitionRegistry() 方法 ,则这两个方法都得执行

3. Ordered

实现了 Ordered 排序接口决定了执行顺序
PriorityOrderd > Ordered > 没有实现任何排序接口的对象

解析源码

了解上述前置知识后在来查看源码就清晰了许多

  • 入口
PostProcessorRegistrationDelegate.class

    public static void invokeBeanFactoryPostProcessors(
            ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {...}
  • 变量定义
// 已经执行过的BFPP存储在processedBeans中,防止重复执行
Set<String> processedBeans = new HashSet<>();
// 存放BeanFactoryPostProcessor的集合
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
// 存放BeanDefinitionRegistryPostProcessor的集合
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
// 用于保存本次要执行的BeanDefinitionRegistryPostProcessor
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
  • 执行流程
  1. 处理入参中自定义的 beanFactoryPostProcessors 集合
			// 首先处理入参中的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);
                }
            }
  1. 调用所有实现 PriorityOrdered 接口的 BeanDefinitionRegistryPostProcessor 实现类的 postProcessBeanDefinitionRegistry() 方法
			// 找到所有实现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();
  1. 调用所有实现 Ordered 接口的 BeanDefinitionRegistryPostProcessor 实现类的 postProcessBeanDefinitionRegistry() 方法(代码与第二步类似)

  2. 调用所有剩下的 BeanDefinitionRegistryPostProcessorspostProcessBeanDefinitionRegistry() 方法(代码与第二步类似)

  3. 调用所有 BeanDefinitionRegistryPostProcessorpostProcessBeanFactory() 方法

invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
  1. 调用自定义入参 beanFactoryPostProcessors 中的只实现 BeanFactoryPostProcessor 接口的postProcessBeanFactory() 方法
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
  1. 调用 BeanFactoryPostProcessorpostProcessBeanFactory() 方法,按排序顺序执行
        // 用于存放实现了PriorityOrdered接口的BeanFactoryPostProcessor
        List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
        // 用于存放实现了Ordered接口的BeanFactoryPostProcessor的beanName
		List<String> orderedPostProcessorNames = new ArrayList<>(); 
        // 用于存放普通BeanFactoryPostProcessor的beanName
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();

执行流程图

在这里插入图片描述

其他

  1. beanFactory.getBeanNamesForType() 为什么出现三次重复获取
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);

原因:postProcessBeanDefinitionRegistry() 中可添加 BeanDefinitionRegistryPostProcessor,新添加的需要获取到并执行
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值