之前的文章已经介绍了refresh中的obtainFreshBeanFactory和invokeBeanFactoryPostProcessors方法,今天来看下refresh中另外一个比较重要的方法registerBeanPostProcessors。
一、registerBeanPostProcessors源码分析
registerBeanPostProcessors的源码在org.springframework.context.support.PostProcessorRegistrationDelegate#registerBeanPostProcessors(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, org.springframework.context.support.AbstractApplicationContext)下,具体如下
public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
//1、找出所有直接实现BeanPostProcessor接口的类
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
/**
* 2、计算所有的实现BeanPostProcessor接口的类
* beanFactory.getBeanPostProcessorCount():系统注册的实现BeanPostProcessor接口的类
* postProcessorNames.length:自定义实现BeanPostProcessor接口的类
* 上面那么上面两项加起来不就是总数了吗?为什么还要+1? +1是因为下面3中的BeanPostProcessorChecker也实现了BeanPostProcessor接口,也需要注册
*/
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
//3、添加BeanPostProcessorChecker(主要用于记录信息)到beanFactory中
beanFactory.addBeanPostProcessor(new PostProcessorRegistrationDelegate.BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
//3.1、priorityOrderedPostProcessors:继承自PriorityOrdered接口的
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList();
//3.2、internalPostProcessors: 用于存放Spring内部的BeanPostProcessor
List<BeanPostProcessor> internalPostProcessors = new ArrayList();
//3.3、orderedPostProcessorNames: 用于存放实现Ordered接口的
List<String> orderedPostProcessorNames = new ArrayList();
//3.4、nonOrderedPostProcessorNames: 用于存放普通的beanName
List<String> nonOrderedPostProcessorNames = new ArrayList();
String[] var8 = postProcessorNames;
int var9 = postProcessorNames.length;
String ppName;
BeanPostProcessor pp;
//4、遍历postProcessorNames, 将BeanPostProcessors按3.1-3.4定义的变量区分开
for(int var10 = 0; var10 < var9; ++var10) {
ppName = var8[var10];
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
pp = (BeanPostProcessor)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);
}
}
//5、对priorityOrderedPostProcessors进行排序
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
//5.1、将priorityOrderedPostProcessors注册到BeanFactory
registerBeanPostProcessors(beanFactory, (List)priorityOrderedPostProcessors);
List<BeanPostProcessor> orderedPostProcessors = new ArrayList();
Iterator var14 = orderedPostProcessorNames.iterator();
//5.2、遍历orderedPostProcessorNames,获取对应的bean并且添加到orderedPostProcessors/internalPostProcessors
while(var14.hasNext()) {
String ppName = (String)var14.next();
BeanPostProcessor pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
sortPostProcessors(orderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, (List)orderedPostProcessors);
//5.3、重复5.2遍历nonOrderedPostProcessorNames,获取对应的bean并且添加到nonOrderedPostProcessors/internalPostProcessors
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList();
Iterator var17 = nonOrderedPostProcessorNames.iterator();
while(var17.hasNext()) {
ppName = (String)var17.next();
pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
registerBeanPostProcessors(beanFactory, (List)nonOrderedPostProcessors);
sortPostProcessors(internalPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, (List)internalPostProcessors);
//6、注册程序监听器
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
二、registerBeanPostProcessors的功能
从上方的源码中可以看出registerBeanPostProcessors的主要功能有以下两种:
- 找出所有实现BeanPostProcessor接口的类,按照实现PriorityOrdered接口、实现Ordered接口、普通的和实现MergedBeanDefinitionPostProcessor接口的依次进行分类、排序、注册;
- 往beanFactory中添加一个程序监听器。
注意:在registerBeanPostProcessors方法中,只是完成了对实现BeanPostProcessor接口的类的分类、排序和注册,但是不会执行,真正执行的地方在finishBeanFactoryInitialization方法中,具体的请看下篇文章。