前言
执行了 BeanFactory 后置处理器后,Spring 开始准备实例化 Bean。在这之前,Spring 先添加 Bean 后置处理器 BeanPostProcessor,因为 BeanPostProcessor 会在实例化 Bean 使用,所以在这之前实例化,不管是 Spring 内置的,还是程序员提供的,都会在这一步添加到 BeanFactory。
registerBeanPostProcessors
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}
又是这个类 PostProcessorRegistrationDelegate,前面 BeanFactory 后置处理器注册也是由这个类完成。
public static void registerBeanPostProcessors(
ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
// 找出所有的实现了 BeanPostProcessor 接口的 BeanDefinition
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
// 保存同时实现了 PriorityOrdered 接口的 BeanPostProcessor
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
// 同时实现 MergedBeanDefinitionPostProcessor 接口 BeanPostProcessor 标记为内部 BeanPostProcessor
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
// 保存同时实现了 Ordered 接口的 BeanPostProcessor
List<String> orderedPostProcessorNames = new ArrayList<>();
// 保存没有实现 Ordered 或 PriorityOrdered 接口的 BeanPostProcessor
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
// 对找出的 BeanPostProcessor 分类,并实例化实现了 PriorityOrdered 接口的 BeanPostProcessor
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
// 实例化 BeanPostProcessor
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);
}
}
// 排序
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
// 注册到 BeanFactory
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
// 实例化实现了 Ordered 接口的 BeanPostProcessor
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);
// 注册到 BeanFactory
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
// 实例化普通的 BeanPostProcessor
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);
}
}
// 注册到 BeanFactory
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
// 最后对内置的 BeanPostProcessor 排序
sortPostProcessors(internalPostProcessors, beanFactory);
// 注册到 BeanFactory
registerBeanPostProcessors(beanFactory, internalPostProcessors);
// 注册一个监听器
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
如果你仔细看过前面注册 BeanFactory 后置处理器逻辑,在这里一定不会陌生,几乎一模一样。不过这里并不会执行 Bean 后置处理器,就行方法的名字一样,只是注册到 BeanFactory.