截止到目前,我们已经完成了refresh()方法中的invokeBeanFactoryPostProcessors方法的解析,我个人认为invokeBeanFactoryPostProcessors方法是spring中最复杂的方法之一,所以如果你还对invokeBeanFactoryPostProcessors不太熟悉,请先阅读该系列的前面的几篇文章。今天要解析的registerBeanPostProcessors比起前面的内容要简单的多,所以对于这个方法我们只做简单分析。首先,我用一句话概括这个方法的作用,就是把spring容器中已经存在于bdmap中的BeanPostProcessors和一些特定的BeanPostProcessors添加到beanFactory#beanPostProcessors中(beanPostProcessors是一个List),方便后面对beanPostProcessors的调用,至于spring为什么要把beanPostProcessors放到bdmap中,然后在这个方法在放入容器,我们后面做总结。
registerBeanPostProcessors
这里直接交给了PostProcessorRegistrationDelegate#registerBeanPostProcessors处理
public static void registerBeanPostProcessors(
ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
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.
// beanFactory.beanPostProcessors中的是通过beanFactory.addBeanPostProcessor加进来的 这个是通过BeanFactoryPostProcessor和spring前面的初始化步骤里面加进来的
// postProcessorNames 这是注册到BDMap里面的BeanPostProcessor
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
// Separate between BeanPostProcessors that implement PriorityOrdered,
// Ordered, and the rest.
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
// 分类注册
// 1、实现PriorityOrdered
// First, register the BeanPostProcessors that implement PriorityOrdered.
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
// Next, register the BeanPostProcessors that implement Ordered.
// 2、实现Ordered
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
for (String ppName : orderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
sortPostProcessors(orderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
// Now, register all regular BeanPostProcessors.
// 3、注册其余的
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
for (String ppName : nonOrderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
// Finally, re-register all internal BeanPostProcessors.
// 4、注册MergedBeanDefinitionPostProcessor
sortPostProcessors(internalPostProcessors, beanFactory);
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).
// 这个之前注册过,现在会删了之后重新注册
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
- 首先计算了当前BeanPostProcessor的总和(包含bdmap中的和beanFactory#beanPostProcessors中的),然后把个数作为构造函数的参数实例化了BeanPostProcessorChecker对象,然后放入beanFactory#beanPostProcessors中
- 对容器中的BeanPostProcessor进行分类,分为一下四类
实现PriorityOrdered的
实现了PriorityOrdered并且实现了MergedBeanDefinitionPostProcessor的
实现Ordered
其余的 - 按照一下顺序进行注册
- 实现PriorityOrdered的
实现Ordered
其余的
实现了PriorityOrdered并且实现了MergedBeanDefinitionPostProcessor的 - 因为注册时如果有重复的会删了重新添加,所以最终的顺序如下
- 实现PriorityOrdered的并且没实现MergedBeanDefinitionPostProcessor的
实现Ordered
其余的
实现了PriorityOrdered并且实现了MergedBeanDefinitionPostProcessor的 - 最后,往beanFactory#beanPostProcessors中添加了一个ApplicationListenerDetector