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<>();
- 执行流程
- 处理入参中自定义的 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);
}
}
- 调用所有实现 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();
-
调用所有实现 Ordered 接口的 BeanDefinitionRegistryPostProcessor 实现类的
postProcessBeanDefinitionRegistry()
方法(代码与第二步类似) -
调用所有剩下的 BeanDefinitionRegistryPostProcessors 的
postProcessBeanDefinitionRegistry()
方法(代码与第二步类似) -
调用所有 BeanDefinitionRegistryPostProcessor 的
postProcessBeanFactory()
方法
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
- 调用自定义入参 beanFactoryPostProcessors 中的只实现 BeanFactoryPostProcessor 接口的
postProcessBeanFactory()
方法
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
- 调用 BeanFactoryPostProcessor 的
postProcessBeanFactory()
方法,按排序顺序执行
// 用于存放实现了PriorityOrdered接口的BeanFactoryPostProcessor
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
// 用于存放实现了Ordered接口的BeanFactoryPostProcessor的beanName
List<String> orderedPostProcessorNames = new ArrayList<>();
// 用于存放普通BeanFactoryPostProcessor的beanName
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
执行流程图
其他
- beanFactory.getBeanNamesForType() 为什么出现三次重复获取
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
原因:postProcessBeanDefinitionRegistry() 中可添加 BeanDefinitionRegistryPostProcessor,新添加的需要获取到并执行