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
执行到最后进入到这个方法里面: