Spring 源码之核心加载方法(6) 注册 BeanPostProcessor

6. registerBeanPostProcessors

定位: org.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors

1
2
3
4
5
6
/**
* 实例化并注册所有BeanPostProcessor Bean,并遵守显式顺序(如果给定的话)。必须在应用程序Bean的任何实例化之前调用。
*/
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}

6.1 PostProcessorRegistrationDelegate#registerBeanPostProcessors

定位: org.springframework.context.support.PostProcessorRegistrationDelegate#registerBeanPostProcessors(ConfigurableListableBeanFactory, AbstractApplicationContext)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
public static void registerBeanPostProcessors(
ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

// 找出所有实现了 BeanPostProcessor 接口的类的名称
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实现类 目标个数
// 此处为什么要+1呢? 原因: 在此方法的最后会添加一个 BeanPostProcessorChecker 的类
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
// 添加BeanPostProcessorChecker(主要用于记录信息)到beanFactory中
beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

// Separate between BeanPostProcessors that implement PriorityOrdered,
// Ordered, and the rest.
// 存放实现了 PriorityOrdered 接口的 BeanPostProcessor 集合
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
// 存放 Spring 内部实现了 BeanPostProcessor 的实例
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
// 存放实现了 Ordered 接口的 BeanPostProcessor 的 beanName 集合
List<String> orderedPostProcessorNames = new ArrayList<>();
// 存放普通(未实现排序接口)的 BeanPostProcessor 实例
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
// 如果 ppName 对应的 BeanPostProcessor 实例实现了 PriorityOrdered 接口,
// 则获取到 ppName 对应的 BeanPostProcessor 的实例添加到 priorityOrderedPostProcessors 中
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
// Spring内部实现了BeanPostProcessor的实例
internalPostProcessors.add(pp);
}
}
// 如果 ppName 对应的 BeanPostProcessor 实例没有实现 PriorityOrdered 接口,但是实现了 Ordered 接口,
// 那么则将 ppName 对应的 bean 实例添加到 orderedPostProcessorNames 中
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
// 将ppName添加到nonOrderedPostProcessorNames中
nonOrderedPostProcessorNames.add(ppName);
}
}

// First, register the BeanPostProcessors that implement PriorityOrdered.
// 1. 注册实现了 PriorityOrdered 接口的 BeanFactoryPostProcessors 实例对象
// 对实现了 PriorityOrdered 接口的 BeanPostProcessor 实例集合进行排序操作
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
// 注册实现了 PriorityOrdered 接口的 BeanPostProcessor 实例对象添加到 beanFactory 中
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

// Next, register the BeanPostProcessors that implement Ordered.
// 2. 注册实现 Ordered 的 BeanFactoryPostProcessors 实例对象
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
for (String ppName : orderedPostProcessorNames) {
// 根据 ppName 找到对应的 BeanPostProcessor 实例对象
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
// 将实现了 Ordered 接口的 BeanPostProcessor 添加到 orderedPostProcessors 集合中
orderedPostProcessors.add(pp);
// 如果 ppName 对应的 BeanPostProcessor 实例也实现了 MergedBeanDefinitionPostProcessor 接口,
// 那么则将 ppName 对应的 bean 实例添加到 internalPostProcessors 中
if (pp instanceof MergedBeanDefinitionPostProcessor) {
// Spring内部实现了 BeanPostProcessor 的实例
internalPostProcessors.add(pp);
}
}
// 对实现了 Ordered 接口的 BeanPostProcessor 实例集合进行排序操作
sortPostProcessors(orderedPostProcessors, beanFactory);
// 注册实现了 Ordered 接口的 BeanPostProcessor 实例对象添加到 beanFactory 中
registerBeanPostProcessors(beanFactory, orderedPostProcessors);

// Now, register all regular BeanPostProcessors.
// 3. 注册普通(没有实现排序接口)的 BeanFactoryPostProcessors 实例对象
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
for (String ppName : nonOrderedPostProcessorNames) {
// 根据 ppName 获取对应的 BeanPostProcessor 实例对象
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
// 将普通的 BeanPostProcessor 添加到 nonOrderedPostProcessors 集合中
nonOrderedPostProcessors.add(pp);
// 如果 ppName 对应的 BeanPostProcessor 实例也实现了 MergedBeanDefinitionPostProcessor 接口,
// 那么则将 ppName 对应的 bean 实例添加到 internalPostProcessors 中
if (pp instanceof MergedBeanDefinitionPostProcessor) {
// Spring 内部实现了 BeanPostProcessor 的实例
internalPostProcessors.add(pp);
}
}
// 注册普通的 BeanPostProcessor 实例添加到 beanFactory 中
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); // 注册

// Finally, re-register all internal BeanPostProcessors.
// 4. 注册所有 Spring 内部的 BeanPostProcessors 实例(实现了MergedBeanDefinitionPostProcessor接口)
sortPostProcessors(internalPostProcessors, beanFactory);
// Spring 内部的 BeanPostProcessors 实例(实现了 MergedBeanDefinitionPostProcessor 接口)
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).
// 最后,再置换一个新的ApplicationListenerDetector. ApplicationListenerDetector 已重写 equals 方法.
// 置换的原因是因为旧bean的属性singletonNames中已经存在有bdName了。
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}