Spring源码解析–refresh()–invokeBeanFactoryPostProcessor()
final class PostProcessorRegistrationDelegate {
public static void invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
//processedBeans用于存储已经执行过的BeanFactoryPostProcessor,避免重复执行
Set<String> processedBeans = new HashSet<>();
//默认的beanFactory为DefaultListableBeanFactory,而DefaultListableBeanFactory实现了BeanDefinitionRegistry接口,所以此处条件成立
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
//存储非BeanDefinitionRegistryPostProcessor类型的BeanFactoryPostProcessor实例,用于后续执行BeanFactoryPostProcessor.postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
//存储BeanDefinitionRegistryPostProcessor实例,用于后续执行BeanFactoryPostProcessor.postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
//处理外部定义的BeanFactoryPostProcessor,将BeanDefinitionRegistryPostProcessor与BeanFactoryPostProcessor区分开
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
//BeanDefinitionRegistryPostProcessor类型的BeanFactoryPostProcessor
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
//执行postProcessBeanDefinitionRegistry()进行一些特殊BeanDefinition的注册
registryProcessor.postProcessBeanDefinitionRegistry(registry);
registryProcessors.add(registryProcessor);
}
else {
//存储非BeanDefinitionRegistryPostProcessor类型的BeanFactoryPostProcessor实例
regularPostProcessors.add(postProcessor);
}
}
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
//获取之前在bean工厂中注册的BeanDefinitionRegistryPostProcessor实例,SpringBoot默认情况下这里只有ConfigurationClassPostProcessor这唯一一个
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
//先执行实现了PriorityOrdered(实现了Ordered接口的在下面而不是这里执行)的BeanDefinitionRegistryPostProcessor
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
//放入currentRegistryProcessors,待后面排序好后再执行
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
//提前放入processedBeans防止重复执行,但是此时尚未执行,因为要按照PriorityOrdered排好序后再执行
processedBeans.add(ppName);
}
}
//对添加进currentRegistryProcessors的BeanDefinitionRegistryPostProcessor按照PriOrityOrdered进行排序
sortPostProcessors(currentRegistryProcessors, beanFactory);
//currentRegistryProcessors全部添加进registryProcessors中
registryProcessors.addAll(currentRegistryProcessors);
//遍历并执行currentRegistryProcessors中的实例的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()方法
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
//currentRegistryProcessors没用了,清空它
currentRegistryProcessors.clear();
//获取之前在bean工厂中注册的BeanDefinitionRegistryPostProcessor实例,SpringBoot默认情况下这里还是只有ConfigurationClassPostProcessor这唯一一个
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
//判断之前是否已经执行过(防止上面实现了PriorityOrdered接口的重复执行),执行实现了Ordered接口的BeanDefinitionRegistryPostProcessor
if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
//提前放入processedBeans防止重复执行,但是此时尚未执行,因为要按照Ordered排好序后再执行
processedBeans.add(ppName);
}
}
//********
//Question:为什么实现了Ordered和PriorityOrdered的类实例要分开执行?
//Answer:因为Spring规定了PriorityOrdered优先级比Ordered要高
//********
//对添加进currentRegistryProcessors的BeanDefinitionRegistryPostProcessor按照Ordered进行排序
sortPostProcessors(currentRegistryProcessors, beanFactory);
//currentRegistryProcessors全部添加进registryProcessors中
registryProcessors.addAll(currentRegistryProcessors);
//遍历并执行currentRegistryProcessors中的实例的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()方法
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
//currentRegistryProcessors没用了,清空它
currentRegistryProcessors.clear();
//********
//Question:为什么处理没有用Ordered和PriorityOrdered接口的BeanDefinitionRegistryPostProcessor要用while一直循环下去呢?
//Answer:因为防止执行过程中又有新的BeanDefinitionRegistryPostProcessor加入到了beanFactory中-----为什么会有后续又添加新的进去的情况,因为BeanDefinitionRegistryPostProcessor是允许新注册BeanDefinition的####postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
//********
//最后处理没有用Ordered和PriorityOrdered接口的BeanDefinitionRegistryPostProcessor
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);
//由于有尚未执行的BeanDefinitionRegistryPostProcessor,所以后续执行该实例代码的接口代码的时候,有可能会心注册BeanDefinition,而这BeanDefinition有可能是BeanDefinitionRegistryPostProcessor类型的,所以此处reiterate重新赋值为true,开始新一轮while循环,直到下一次循环时beanFactory中没有新的BeanDefinitionRegistryPostProcessor,说明上一轮while循环中并没有注册新的BeanDefinitionRegistryPostProcessor的BeanDefinition,然后便可以跳出循环了。
reiterate = true;
}
}
//对添加进currentRegistryProcessors的BeanDefinitionRegistryPostProcessor排序
sortPostProcessors(currentRegistryProcessors, beanFactory);
//currentRegistryProcessors全部添加进registryProcessors中
registryProcessors.addAll(currentRegistryProcessors);
//遍历并执行currentRegistryProcessors中的实例的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()方法
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
//currentRegistryProcessors没用了,清空它
currentRegistryProcessors.clear();
}
//执行BeanFactoryPostProcessor.postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
}
else {
//BeanFactory如果不归属于BeanDefinitionRegistry类型,则直接执行beanFactoryPostProcessor
invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
}
//获取beanFactory中注册的非BeanDefinitionRegistryPostProcessor的BeanFactoryPostProcessor,用于后面调用
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
//之前已经执行过的直接跳过
if (processedBeans.contains(ppName)) {
// skip - already processed in first phase above
}
else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
//实现了PriorityOrdered接口的添加到priorityOrderedPostProcessors中
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
//实现了Ordered接口的添加到orderedPostProcessorNames中
orderedPostProcessorNames.add(ppName);
}
else {
//未实现排序接口的添加到nonOrderedPostProcessorNames中
nonOrderedPostProcessorNames.add(ppName);
}
}
//********
//由于Spring规定PriorityOrdered优先级高于Ordered,所以PriorityOrdered先执行
//********
//对实现PriorityOrdered接口的BeanFactoryPostProcessor进行排序然后执行BeanFactoryPostProcessor.postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
for (String postProcessorName : orderedPostProcessorNames) {
orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
//对实现Ordered接口的BeanFactoryPostProcessor进行排序然后执行BeanFactoryPostProcessor.postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法
sortPostProcessors(orderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
for (String postProcessorName : nonOrderedPostProcessorNames) {
nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
//执行未实现PriorityOrderd和Ordered接口的BeanFactoryPostProcessor.postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
// Clear cached merged bean definitions since the post-processors might have
// modified the original metadata, e.g. replacing placeholders in values...
beanFactory.clearMetadataCache();
}
}