invokeBeanFactoryPostProcessors概述
一般情况下:
执行到这个方法的beanFactory的beanDefinitionMap中有6个BeanDefinition,5个基础BeanDefinition+AppConfig的 BeanDefinition
而这6个中只有一个BeanFactoryPostProcessor:ConfigurationClassPostProcessor
这里会执行ConfigurationClassPostProcessor进行@Component的扫描,扫描得到BeanDefinition,并注册到beanFactory中
注意:扫描的过程中可能又会扫描出其他的BeanFactoryPostProcessor,那么这些BeanFactoryPostProcessor也得在这一步执行
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
registryProcessor.postProcessBeanDefinitionRegistry(registry);
registryProcessors.add(registryProcessor);
}
else {
regularPostProcessors.add(postProcessor);
}
在这个方法的第一步其实用来处理调用API(addBeanFactoryPostProcessor)添加的beanFactory后置处理器
默认情况下这里一个购置处理器都不会有,但是如果程序员调用API进行了添加,这里就会执行
BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry(BeanDefinitionRegistry),
并且这个方法还传入了一个参数BeanDefinitionRegistry 就说明,这个方法可以进行BeanDefinitiojn的注册
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
这里一般情况下只会扫描到一个后置处理器 internalConfigurationAnnotationProcessor ,其实际的类型为 ConfigruationClassPostProcessor,并且这个后置处理器,关于这个后置处理器做了什么事情,笔者会在单独进行讲解
总的来说这里要做的事情就是调用容器中实现了PriorityOrdered的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
这一阶段类似于上一阶段,是调用 容器中实现恶劣Ordered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry
但是这里有一个关键点!processedBeans.contains(ppName),processedBeans这个集合里面装的是已经执行过的后置处理器,也就是说
这里不会重复执行之前执行过的后置处理器
boolean reiterate = true;
while (reiterate) {
reiterate = false;
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
reiterate = true;
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
}
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
最后一步执行的就是普通的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry,同样需要将执行过的后置处理器排除在外
这里使用到了一个while循环,从代码层面来看,循环的终止条件是没有找到 需要执行的BeanDefinitionRegistryPostProcessor的时候,就会跳出循环,为什么要这么处理?
因为我们在执行当前的 后置处理器的时候,这个后置处理器可能会添加新的后置处理器,为了保证新的后置处理器的执行,就要进行这种迭代的调用
以上是对BeanDefinitionRegistryPostProcessor 的 postProcessBeanDefinitionRegistry方法进行回调的流程
而接下来就是 对BeanFactoryPostProcessor的postProcessBeanFactory 进行回调
同样的是先执行实现了PriorityOrdered接口的,再执行Order接口的,最后执行普通的后置处理器,这里就不做过多的分析了