# Spring
源码 - 容器刷新#registerBeanPostProcessors()
Spring
版本:Spring 5.3.13-release
# 1、registerBeanPostProcessors()
注册BeanPostProcessor
处理器
AbstractApplicationContext#registerBeanPostProcessors()
代码:
/**
* Instantiate and register all BeanPostProcessor beans,
* respecting explicit order if given.
* <p>Must be called before any instantiation of application beans.
*
* 按照指定的顺序实例化并注册所有的 BeanPostProcessor Bean
*/
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}
从上面可以看出,AbstractApplicationContext
将BeanPostProcessor
的注册工作委派给PostProcessorRegistrationDelegate
进行注册。
PostProcessorRegistrationDelegate#registerBeanPostProcessors()
代码:
public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
// WARNING: Although it may appear that the body of this method can be easily
// refactored to avoid the use of multiple loops and multiple lists, the use
// of multiple lists and multiple passes over the names of processors is
// intentional. We must ensure that we honor the contracts for PriorityOrdered
// and Ordered processors. Specifically, we must NOT cause processors to be
// instantiated (via getBean() invocations) or registered in the ApplicationContext
// in the wrong order.
//
// Before submitting a pull request (PR) to change this method, please review the
// list of all declined PRs involving changes to PostProcessorRegistrationDelegate
// to ensure that your proposal does not result in a breaking change:
// https://github.com/spring-projects/spring-framework/issues?q=PostProcessorRegistrationDelegate+is%3Aclosed+label%3A%22status%3A+declined%22
// 获取所有的 BeanPostProcessor 的 BeanName
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
// Register BeanPostProcessorChecker that logs an info message when
// a bean is created during BeanPostProcessor instantiation, i.e. when
// a bean is not eligible for getting processed by all BeanPostProcessors.
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
// BeanPostProcessorChecker 是一个普通的信息打印
// 可能存在有些情况当 Spring 配置中的后置处理器还没有被注册就已经开始 Bean 的实例化了, 这个时候就会打印出 BeanPostProcessorChecker 中设定的信息
beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
// Separate between BeanPostProcessors that implement PriorityOrdered,
// Ordered, and the rest.
// 用于保存实现了 PriorityOrdered 排序接口的 BeanPostProcessor
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
// 用于保存 MergedBeanDefinitionPostProcessor 类型 BeanPostProcessor
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
// 用于保存实现了 Ordered 排序接口的 BeanPostProcessor 的 BeanName
List<String> orderedPostProcessorNames = new ArrayList<>();
// 用于保存没有实现任何排序接口的 BeanPostProcessor 的 BeanName
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
// 遍历所有的 BeanPostProcessor 的 BeanName, 按照不同筛选条件放入相应的容器中
for (String ppName : postProcessorNames) {
// 如果实现了 PriorityOrdered 排序接口
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
// 根据 BeanName 获取 Bean 实例并放入 priorityOrderedPostProcessors 中
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);
// 如果是 MergedBeanDefinitionPostProcessor 类型的 BeanPostProcessor 继续放入 internalPostProcessors 中
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
// 如果实现了 Ordered 排序接口
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
// 将 BeanName 放入 orderedPostProcessorNames 中
orderedPostProcessorNames.add(ppName);
}
// 没有实现任何排序接口
else {
// 将 BeanName 放入 nonOrderedPostProcessorNames 中
nonOrderedPostProcessorNames.add(ppName);
}
}
// First, register the BeanPostProcessors that implement PriorityOrdered.
// 对实现了 PriorityOrdered 排序接口的 BeanPostProcessor 进行排序
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
// 根据排序结果依次注册 BeanPostProcessor 到 BeanFactory 中,
// 实际就是将排序后的 BeanPostProcessor 保存到 AbstractBeanFactory#beanPostProcessors 容器中
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
// Next, register the BeanPostProcessors that implement Ordered.
// 创建一个容器用于存放实现了 Ordered 排序接口的 BeanPostProcessor
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
// 遍历实现了 Ordered 排序接口的 BeanPostProcessor 的 BeanName
for (String ppName : orderedPostProcessorNames) {
// 根据 BeanName 获取 Bean 实例并放入 orderedPostProcessors 中
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
// 如果是 MergedBeanDefinitionPostProcessor 类型的 BeanPostProcessor 继续放入 internalPostProcessors 中
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
// 对实现了 Ordered 排序接口的 BeanPostProcessor 的 Bean 实例进行排序
sortPostProcessors(orderedPostProcessors, beanFactory);
// 根据排序结果依次注册 BeanPostProcessor 到 BeanFactory 中,
// 实际就是将排序后的 BeanPostProcessor 保存到 AbstractBeanFactory#beanPostProcessors 容器中
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
// Now, register all regular BeanPostProcessors.
// 创建一个容器用于存放没有实现任何排序接口的 BeanPostProcessor
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
// 遍历没有实现任何排序接口的 BeanPostProcessor 的 BeanName
for (String ppName : nonOrderedPostProcessorNames) {
// 根据 BeanName 获取 Bean 实例并放入 nonOrderedPostProcessors 中
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
// 如果是 MergedBeanDefinitionPostProcessor 类型的 BeanPostProcessor 继续放入 internalPostProcessors 中
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
// 注册 BeanPostProcessor 到 BeanFactory 中
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
// Finally, re-register all internal BeanPostProcessors.
// 对 MergedBeanDefinitionPostProcessor 类型的 BeanPostProcessor 进行排序
sortPostProcessors(internalPostProcessors, beanFactory);
// 注册 BeanPostProcessor 到 BeanFactory 中, 注册时会先执行移除已存在的 BeanPostProcessor 然后在进行添加
registerBeanPostProcessors(beanFactory, internalPostProcessors);
// Re-register post-processor for detecting inner beans as ApplicationListeners,
// moving it to the end of the processor chain (for picking up proxies etc).
// 添加处理用户自定义 ApplicationListener 注册和销毁的 BeanPostProcessor
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
这里代码很长,但是做的事情还是非常清晰的。按照排序接口依次注册BeanPostProcessor
到IOC
容器中。与invokeBeanFactoryPostProcessors()
方法不同的是,这里只是将BeanPostProcessor
进行实例化并注册到容器中,并没有对其进行激活。
GitHub源码地址:https://github.com/kapbc/kapcb-spring-source/tree/master/Spring-Framework-v5.3.13
备注:此文为笔者学习
Spring
源码的笔记,鉴于本人技术有限,文中难免出现一些错误,感谢大家批评指正。