spring源码---refresh下invokeBeanFactoryPostProcessors详解

invokeBeanFactoryPostProcessors

关系及大致流程

执行之前了解:
记住 BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子类
在这里插入图片描述
接下来是嫖的大致流程图

在这里插入图片描述在这里插入图片描述

具体方法:

在这里插入图片描述
前面这一部分就是进行一些判断 建立集合操作等等 详细看注释

后面这个 循环 就是判断 传的参数 (里面包涵你加进去的)
实现了 BeanDefinitionRegistryPostProcessor 就执行他的方法
要是没实现的这个接口 能进来 证明 实现了BeanPostProcessor
那就将其统一存放 后续一起拿出来执行postProcessBeanFactory方法
在这里插入图片描述
后面这个的步骤 用于找出beanfacory里面实现了 BeanDefinitionRegistryPostProcessor 并且实现了PriorityOrdered 和
Ordered
分别进行排序执行
这个是对PriorityOrdered 进行执行:在这里插入图片描述
在这里插入图片描述这个是对Ordered进行执行:
在这里插入图片描述
这是对那些两个接口都没实现的进行执行:
在这里插入图片描述
最后分别调用集合里面存放好的:
BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor
他们的 postProcessBeanFactory在这里插入图片描述
至于上图的else 对应的是这个:
在这里插入图片描述
执行完上述的方法后 达成条件:
入参beanFactoryPostProcessors和容器中的所有BeanDefinitionRegistryPostProcessor已经全部处理完毕
下面的方法就是对 容器里面 实现了BeanFactoryPostProcessor开始进行查找和实现:

// 到这里为止,入参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();

补充

前半部分 为什么这么多重复代码 后面就没有了

前面主要是因为 在对 BeanDefinitionRegistryPostProcessor进行操作
而这个类 里面可以对 BeanDefinitionRegistryPostProcessor 进行添加 所以你在执行上一个的时候 可能又产生了 新的 BeanDefinitionRegistryPostProcessor
看图片:
他这个类 就这一个方法 我们点进去看BeanDefinitionRegistry 这里面就可以进行注册
在这里插入图片描述
这里你可能有疑问 注册的是 BeanDefinition 并且BeanDefinition又不是 BeanDefinitionRegistryPostProcessor 他们的子类
解释: 是因为有方法可以进行转换

在这里插入图片描述

扯回来 为什么 后面半截不需要重复代码:
看图片
在这里插入图片描述
这个接口就一个方法 我们点进去 这个参数的类看看:
在这里插入图片描述
明显 这个类里面 没有方法可以进行添加
BeanDefinition 或者 BeanFactoryPostProcessor 他们的子类

在哪里进行实列化的

**记住如果你实现了 图上面所说的那几个接口 在这个方法里面 就会实列化和执行自定义的方法 提前执行 docreatBean 那些操作 **
在这里插入图片描述

注解下如何进行实现的

对于这个类有空进行完善补充
开启注解模式后有这么一个类会进行使用加载;
在这里插入图片描述
这个类的介绍:
在这里插入图片描述

会使用到他的 postprocessBeandifinitionRegistry

在这里插入图片描述
执行到最后进入到这个方法里面:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值