上篇传送门
前两篇咱们了解了component-scan和其他一些注解的解析成bean定义信息的过程,前者是通过XML的方式loadBeanDefinition,后者通过ConfigurationClassPostProcessor来实现,那么这时候,bean的定义信息基本上算是完成了,接下来进行注册BPP
BPP就是用来拦截bean的创建,在初始化前后进行增强,具体细节咱们后面会详聊
- 获取所有BPP的bean名称
- 创建一个BeanPostProcessorChecker
- 遍历BPP名称
- 分组并实例化
- 注册
流程图
源码
public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
// 获取所有的bean名称(这里是从bean定义信息中获取)
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
// 创建一个BeanPostProcessorChecker,并给赋值BPP的数量
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
// 实现了priorityOrdered的BPP对象
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
// 内部的BPP对象
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
// 实现了Order的BPP名称
List<String> orderedPostProcessorNames = new ArrayList<>();
// 普通的BPP名称
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
//是否实现了PriorityOrdered
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
// 创建实例
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
// 添加到集合中
priorityOrderedPostProcessors.add(pp);
// 如果属于MergedBeanDefinitionPostProcessor代表是内部的BPP
if (pp instanceof MergedBeanDefinitionPostProcessor) {
// 添加到内部的BPP集合中
internalPostProcessors.add(pp);
}
}
// 如果实现了Order接口,添加到ordered结合中
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}else {
// 其他的是普通的BPP
nonOrderedPostProcessorNames.add(ppName);
}
}
// 排序
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
//先注册实现了priorityOrdered接口的BPP
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
// 存储实现了ordered接口的BPP
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
for (String ppName : orderedPostProcessorNames) {
// 实例化实现了Order接口的BPP
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
// 添加到失恋了ordered集合
orderedPostProcessors.add(pp);
// 如果实现了MergedBeanDefinitionPostProcessor代表是内部的BPP
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
// 对实现了order接口的BPP进行排序
sortPostProcessors(orderedPostProcessors, beanFactory);
// 注册实现了order接口的BPP
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
// 创建普通BPP容器
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
for (String ppName : nonOrderedPostProcessorNames) {
// 实例化普通的BPP
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
// 添加到容器
nonOrderedPostProcessors.add(pp);
// 如果实现了MergedBeanDefinitionPostProcessor代表是内部BPP
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
// 注册普通的BPP
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
// 对内部的BPP进行排序
sortPostProcessors(internalPostProcessors, beanFactory);
// 注册内部的BPP
registerBeanPostProcessors(beanFactory, internalPostProcessors);
// 最后注册Spring应用的探测器
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}