之前的文章已经介绍了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);
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
//3、添加BeanPostProcessorChecker(主要用于记录信息)到beanFactory中
beanFactory.addBeanPostProcessor(new PostProcessorRegistrationDelegate.BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
//3.1、priorityOrderedPostProcessors:继承自PriorityOrdered接口的
List priorityOrderedPostProcessors = new ArrayList();
//3.2、internalPostProcessors: 用于存放Spring内部的BeanPostProcessor
List internalPostProcessors = new ArrayList();
//3.3、orderedPostProcessorNames: 用于存放实现Ordered接口的
List orderedPostProcessorNames = new ArrayList();
//3.4、nonOrderedPostProcessorNames: 用于存放普通的beanName
List 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 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 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中添加一个程序监听器。
注意:
1.由于该方法中有getBean(),因此也会涉及getBean--->doGetBean--->createBean---->doCreateBean等操作;
2.在registerBeanPostProcessors方法中,只是完成了对实现BeanPostProcessor接口的类的分类、排序和注册,但是不会执行,真正执行的地方在finishBeanFactoryInitialization方法中,具体的请看下篇文章。
看完之后估计大家还会有一个问题,它如何找到所有的BeanPostProcessor?
之前的文章我们说过在refresh()方法中,会先执行完invokeBeanFactoryPostProcessor()方法,这样所有自定义的BeanPostProcessor类均已经被扫描出并解析成BeanDefinition(扫描和解析又是谁做的呢?ConfigurationClassPostProcessor做的),存入至BeanFactory的BeanDefinitionMap,所以这儿能通过方法如下一行代码找出所有的BeanPostProcessor,然后通过getBean()全部实例化,最后再将实例化后的对象加入到BeanFactory的beanPostProcessors属性中。



