在下覺得這篇博文是目前把PostProcessorRegistrationDelegate.registerBeanPostProcessors()解釋得最詳細的
//擷取bean後置處理器名字并轉為數組postProcessorNames
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.
//注冊BeanPostProcessorChecker,當在BeanPostProcessor執行個體化期間建立Bean時,即當某個Bean不适合所有BeanPostProcessor處理時,記錄一條資訊消息
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
//檢查所有bean是否都經過了後置處理器
beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
// Separate between BeanPostProcessors that implement PriorityOrdered,
// Ordered, and the rest.
//定義變量<BeanPostProcessor> priorityOrderedPostProcessors——優先級最高的後置處理器
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
//定義變量<BeanPostProcessor> internalPostProcessors——内部後置處理器
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
//定義變量<String> orderedPostProcessorNames——第二優先級的後置處理器名
List<String> orderedPostProcessorNames = new ArrayList<>();
//t<String> nonOrderedPostProcessorNames——沒排序的後置處理器名
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
//周遊bean後置處理器名
for (String ppName : postProcessorNames) {
//如果他們屬于最高優先級,則
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
//根據bean後置處理器名稱轉為bean後置處理器對象
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
//priorityOrderedPostProcessors(最高優先級)加入此bean對象
priorityOrderedPostProcessors.add(pp);
//該bean是否屬于MergedBeanDefinitionPostProcessor(在屬性注入之前處理的後置處理器)
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
//屬于第二優先級
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
//orderedPostProcessorNames加入此bean後置處理器名稱
orderedPostProcessorNames.add(ppName);
}
//都不是則
else {
nonOrderedPostProcessorNames加入此後置處理器名稱
nonOrderedPostProcessorNames.add(ppName);
}
}
// First, register the BeanPostProcessors that implement PriorityOrdered.
//首先,執行最高優先級的後置處理器
//排序
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
//注冊最高優先級的後置處理器
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
// Next, register the BeanPostProcessors that implement Ordered.
//接下來,處理第二優先級的bean後置處理器
//定義<BeanPostProcessor> orderedPostProcessors裝載第二優先級的bean後置處理器
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
//循環周遊orderedPostProcessorNames
for (String ppName : orderedPostProcessorNames) {
//根據bean後置處理器名稱轉為bean後置處理器對象
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
//pp插入到orderedPostProcessors
orderedPostProcessors.add(pp);
//該bean是否屬于MergedBeanDefinitionPostProcessor(在屬性注入之前處理的後置處理器)
if (pp instanceof MergedBeanDefinitionPostProcessor) {
//internalPostProcessors(内部後置處理器)加入該後置處理器
internalPostProcessors.add(pp);
}
}
//排序orderedPostProcessors
sortPostProcessors(orderedPostProcessors, beanFactory);
//注冊orderedPostProcessors
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
// Now, register all regular BeanPostProcessors.
//然後,處理最低優先級的bean後置處理器
//定義最低優先級的後置處理器集合變量<BeanPostProcessor> nonOrderedPostProcessors
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
for (String ppName : nonOrderedPostProcessorNames) {
//根據bean後置處理器名反射出bean後置處理器對象
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
//nonOrderedPostProcessors加入此bean後置處理器對象
nonOrderedPostProcessors.add(pp);
//該bean是否屬于MergedBeanDefinitionPostProcessor(在屬性注入之前處理的後置處理器)
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors(内部後置處理器)加入該後置處理器
internalPostProcessors.add(pp);
}
}
//不經過排序直接注冊nonOrderedPostProcessors
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
// Finally, re-register all internal BeanPostProcessors.
//
//最後,處理内部後置處理器
//排序internalPostProcessors
sortPostProcessors(internalPostProcessors, beanFactory);
//注冊internalPostProcessors
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).
//重新注冊後處理器以将内部bean檢測為ApplicationListener,并将其移至處理器鍊的末尾(用于拾取代理等)。
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
流程歸納總結
按照優先級分别進行插入緩存、排序、注冊、清除緩存