调用registerBeanPostProcessors方法将容器中的BeanPostProcessor提取出来注册进容器的集合中供对Bean创建时调用
导图
AbstractApplicationContext#registerBeanPostProcessors
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}
PostProcessorRegistrationDelegate#registerBeanPostProcessors()
/**
* 向BeanFactory中注册BeanPostProcessor
*/
public static void registerBeanPostProcessors(
ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
/**
* 获取BeanFactory中所有实现了BeanPostProcessor接口的BeanName
*/
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.
/**
* 获取容器中应该存在多少BeanPostProcessor
* 数量为已经注册的 + 下面一行注册的一个 + 从BeanDefinition的map中拿出来的
*/
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
/**
* 注册一个BeanPostProcessor
* 根据注释:注册BeanPostProcessorChecker,当bean在BeanPostProcessor实例化期间创建时,即当bean不符合所有
* BeanPostProcessor处理的条件时,记录信息消息。
* 不理解其中的含义
*/
beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
// Separate between BeanPostProcessors that implement PriorityOrdered,
// Ordered, and the rest.
/**
* 存放实现了PriorityOrdered接口的BeanPostProcessor实例
*/
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
/**
* 存放实现了MergedBeanDefinitionPostProcessor接口的BeanPostProcessor实例
*/
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
/**
* 存放实现了Ordered接口的BeanPostProcessor实例
*/
List<String> orderedPostProcessorNames = new ArrayList<>();
/**
* 存放剩余的BeanPostProcessor实例
*/
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
/**
* 遍历实现了BeanPostProcessor接口的BeanName
*/
for (String ppName : postProcessorNames) {
/**
* 实现了PriorityOrdered接口的话就获取实例存放到集合中
* 如果实例实现了MergedBeanDefinitionPostProcessor中存放到相应的集合中
*/
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
/**
* 实现了Ordered接口的话就将BeanName存放到相应集合中
*/
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
/**
* 没有实现任何排序接口的话就将BeanName存放到相应集合中
*/
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
// First, register the BeanPostProcessors that implement PriorityOrdered.
/**
* 对实现了BeanPostProcessor接口和PriorityOrdered接口的实例进行排序
* 然后注册进容器中
*/
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
/**
* 遍历实现了BeanPostProcessor接口和Ordered接口的BeanName
* 获取其实例添加到相应的集合中,如果实现了MergedBeanDefinitionPostProcessor中存放到相应的集合中
* 然后排序注册进容器中
*/
// Next, register the BeanPostProcessors that implement Ordered.
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
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);
/**
* 遍历剩余实现了BeanPostProcessor接口BeanName
* 获取其实例添加到相应的集合中,如果实现了MergedBeanDefinitionPostProcessor中存放到相应的集合中
* 然后注册进容器中
*/
// Now, register all regular BeanPostProcessors.
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
for (String ppName : nonOrderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
/**
* 最后排序实现了MergedBeanDefinitionPostProcessor接口的BeanPostProcessor
* 然后注册进容器中
*/
// Finally, re-register all internal BeanPostProcessors.
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));
}
registerBeanPostProcessors
private static void registerBeanPostProcessors(
ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {
for (BeanPostProcessor postProcessor : postProcessors) {
beanFactory.addBeanPostProcessor(postProcessor);
}
}