Spring-IOC原理之invokeBeanFactoryPostProcessor详解

前言

在前几篇的Spring-IOC原理系列博文中已经介绍了一下Spring-IOC大致流程。也大致了解了其中的流程,这次我们就来详细解读一下refresh()方法中的invokeBeanFactoryPostProcessors()方法。该方法会实例化和调用所有的BeanFactoryPostProcessor(包括其子类BeanDefinitionRegistryPostProcess),所以该方法是很重要的。参考这里流程图阅读会更加容易理解

BeanFactoryPostProcessor接口是Spring初始化BeanFactory时对外暴露的扩展点,Spring-IOC容器与允许BeanFactoryPostProcessor在实例化任何bean之前读取bean定义,并且可以修改它。

BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor,比BeanFactoryPostProcessor具有更高级的优先级,主要用来常规的BeanFactoryPostProcessor检测开始之前注册其他的bean定义。特别是,可以通过BeanDefinitionRegistryPostProcessor来注册一些常规的BeanFactoryPostProcessor,因为此时所有的常规BeanFactoryPostProcessor都还没有开始被处理。

正文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
/**
* 1.getBeanFactoryPostProcessors(): 拿到当前应用上下文beanFactoryPostProcessors变量中的值
* 2.invokeBeanFactoryPostProcessors: 实例化并调用所有已注册的BeanFactoryPostProcessor
*/
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
}

invokeBeanFactoryPostProcessors()方法中首先会调用方法getBeanFactoryPostProcessors()来拿到当前应用上下文beanFactoryPostProcessors变量中的值。然后再执行

1
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

来实例化并且调用所有已经注册的BeanFactoryPostProcessor。进入方法中

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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
public static void invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

// Invoke BeanDefinitionRegistryPostProcessors first, if any.
Set<String> processedBeans = new HashSet<>();

/** 判断beanFactory 是不是BeanDefinitionRegistry 如果是则直接调用invokeBeanFactoryPostProcessors,
* 否则将 beanDefinitionRegistry转化为BeanFactoryPostProcessor 然后在执行如果是则直接调用invokeBeanFactoryPostProcessors
* beanFactory是DefaultListableBeanFactory,是BeanDefinitionRegistry的实现类,所以肯定满足if条件
*/
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
/**
* regularPostProcessors用来存放BeanFactoryPostProcessor
*/
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
/**
* registryProcessors用来存放BeanDefinitionRegistryProcessors
* BeanDefinitionRegistryProcessors扩展了BeanFactoryPostProcessor
*/
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

/**
* 循环进来的beanFactoryPostProcessors,正常情况下,beanFactoryPostProcessors肯定是没有数据的
* 因为beanFactoryPostProcessors是获得手动添加的,而不是spring扫描的,
* 只有手动调用annotationConfigApplicationContext.addBeanFactoryPostProcessor(...)才会有数据
*/
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
/**
* 判断postProcessor是不是BeanDefinitionRegistryPostProcessor,因为BeanDefinitionRegistryPostProcessor
* 扩展了BeanFactoryPostProcessor,所以这里首先判断是不是BeanDefinitionRegistryPostProcessor
* 如果是的话,直接就执行postProcessBeanDefinitionRegistry(...)方法,然后把对象装到registryProcessors中
*/
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
/** 注册bean定义后置处理器 */
registryProcessor.postProcessBeanDefinitionRegistry(registry);
registryProcessors.add(registryProcessor);
}
else {
/**
* 如果不是就装到regularPostProcessors中
*/
regularPostProcessors.add(postProcessor);
}
}

/** 这里不会初始化FactoryBeans,会让bean工厂后置处理器去初始化这些常规bean
* 并且将这些bean分离出来按照 BeanDefinitionRegistryPostProcessors实现的接口*/
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
/**
* 1、调用 实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessors后置处理器
* 获得实现BeanDefinitionRegistryPostProcessors接口类的BeanName: org.springframework.context.annotation.internalConfigurationAnnotationProcessor
* 并且装入数组postProcessorNames中,如果自定义了实现了BeanDefinitionRegistryPostProcessor接口的类,并且也在自定义的类上打上了@Component注解
* 在这一步还是拿不到自定义的这个类,因为spring还没有进行扫描。
* 扫描是在ConfigurationPostProcessor类中完成的也就是下面的invokeBeanDefinitionRegistryPostProcessors(...)方法
*/
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
/**
* 获得ConfigurationClassPostProcessor并且放到currentRegistryProcessors
* ConfigurationClassPostProcessor是很重要的一个类,他实现了BeanDefinitionRegistryPostProcessor接口
* BeanDefinitionRegistryPostProcessor又实现了BeanFactoryPostProcessor接口
* ConfigurationClassPostProcessor里面执行了扫描Bean,Import,ImportResource等各种操作
* 用来处理配置类的各种逻辑
*/
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
/**
* 把name放到processedBeans,后续会根据这个集合来判断处理器是否已经被执行过了
*/
processedBeans.add(ppName);
}
}
/**
* 排序处理
*/
sortPostProcessors(currentRegistryProcessors, beanFactory);
/**
* 合并currentRegistryProcessors,这里为什么要这么做呢?因为registryProcessors是装载BeanDefinitionRegistryPostProcessor的
* 一开始的时候,spring只会执行BeanDefinitionRegistryPostProcessor独有的方法,而不会执行BeanDefinitionRegistryPostProcessor
* 父类的方法,即BeanFactoryProcessor的方法,所以这里把处理器统一放在集合中,后期统一执行父类方法
*/
registryProcessors.addAll(currentRegistryProcessors);
/**
* 第一次调用bean定义后置处理器,这个方法比较重要,需要我们点进去详细研究一下
* 可以理解为执行ConfigurationClassPostProcessor的postProcessorBeanDefinitionRegistry()方法
* spring热插拔的体现,向ConfigurationClassPostProcessor就相当于一个组件,spring很多的事情就是交给
* 组件去管理的,如果不想用这个组件,直接吧注册组件的那一步去掉就可以
* 注册@Import等注解也是在这个方法中调用
*/
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
/**
* 因为currentRegistryProcessors是一个临时变量,所以需要清除掉
*/
currentRegistryProcessors.clear();

// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
/**
* 2、调用实现Ordered接口的BeanDefinitionRegistryPostProcessors后置处理器
* 再次根据BeanDefinitionRegistryPostProcessor获取BeanName,看这个BeanName是否已经被执行过了,有没有实现Ordered接口
* 如果没有执行过,也实现了Ordered接口的话,把对象推送到currentRegistryProcessors,名称推送到processedBeans
* 如果没有实现Order接口的话,这里不把数据加到currentRegistryProcessors、processedBeans中,后续再做处理
* 这里才可以获取我们自定义的实现了BeanDefinitionRegistryPostProcessor的Bean
*/
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
/**
* 排序处理
*/
sortPostProcessors(currentRegistryProcessors, beanFactory);
/**
* 合并processors
*/
registryProcessors.addAll(currentRegistryProcessors);
/**
* 执行我们自定义的BeanDefinitionRegistryPostProcessor
*/
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
/**
* 清空临时变量
*/
currentRegistryProcessors.clear();

// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
/**
* 3、调用其他所有的BeanDefinitionRegistryPostProcessors后置处理器
* 上面的代码是执行了实现了Ordered接口的BeanDefinitionRegistryPostProcessor,
* 下面的代码是执行没有实现Ordered接口的BeanDefinitionRegistryPostProcessor
*/
boolean reiterate = true;
while (reiterate) {
reiterate = false;
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
reiterate = true;
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
/** 第三次调用bean定义后置处理器 */
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
}

// Now, invoke the postProcessBeanFactory callback of all processors handled so far.
/**
* 调用目前处理的所有后置处理器的回调函数
* registryProcessors装的是BeanDefinitionRegistryPostProcessor
* 上面的代码是执行子类独有的方法,这里需要再把父类的方法也执行一次
*/
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
/**
* regularPostProcessors装的是BeanFactoryPostProcessor,执行BeanFactoryPostProcessor的方法
* 但是regularPostProcessors一般情况下,是不会有数据的,只有在外面手动添加BeanFactoryPostProcessor,才会有数据
*/
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
}

else {
// Invoke factory processors registered with the context instance.
/** 调用在上下文实例中注册的工厂处理器。 */
invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
}

// Do not initialize FactoryBeans here: We need to leave all regular beans
// uninitialized to let the bean factory post-processors apply to them!
/** 这里不进行初始化FactoryBeans,而是让bean工厂后置处理器去初始化这些常规的bean */
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,Ordered, and the rest.
/** 分离出 orderedPostProcessorNames 和nonOrderedPostProcessorNames */
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
/**
* 循环BeanNames
*/
for (String ppName : postProcessorNames) {
/**
* 如果这个bean被执行过了,则跳过不执行
*/
if (processedBeans.contains(ppName)) {
// skip - already processed in first phase above
}
/**
* 如果bean实现了PriorityOrdered接口,则加入到priorityOrderedPostProcessors
*/
else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
}
/**
* 如果bean实现了Ordered接口,则加入到orderedPostProcessorNames
*/
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
/**
* 既没有实现PriorityOrdered接口,也没有实现Ordered接口,则加入到nonOrderedPostProcessorNames
*/
else {
nonOrderedPostProcessorNames.add(ppName);
}
}

// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
/**
* 1、调用实现PriorityOrdered接口的bean工厂后置处理器
* 排序处理priorityOrderedPostProcessors,即实现了PriorityOrdered接口的BeanFactoryPostProcessor
*/
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
/**
* 执行priorityOrderedPostProcessor
*/
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
/**
* 2、调用实现Ordered接口实现的bean后置处理器
* 执行实现了Ordered接口的BeanFactoryPostProcessor
*/
List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
for (String postProcessorName : orderedPostProcessorNames) {
orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
sortPostProcessors(orderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

// Finally, invoke all other BeanFactoryPostProcessors.
/**
* 3、调用其他所有的bean后置处理器
* 执行既没有实现PriorityOrdered接口也没有实现Ordered接口的BeanFactoryPostProcessor
*/
List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
for (String postProcessorName : nonOrderedPostProcessorNames) {
nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
/** 这里会调用EventListenerMethodProcessor.postProcessBeanFactory(),注册事件监听器后置处理器 */
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

// Clear cached merged bean definitions since the post-processors might have
// modified the original metadata, e.g. replacing placeholders in values...
beanFactory.clearMetadataCache();
}

首先,判断了beanFactory是不是BeanDefinitionRegistry的实例,这里毋庸置疑肯定是的,然后会执行以下操作:

  1. 定义了一个Set集合,用来装载beanName用的,后面会根据这个集合判断后置处理器是不是被执行过。

    1
    Set<String> processedBeans = new HashSet<>();
  2. 定义了两个List,一个是regularPostProcessors,用来保存BeanFactoryPostProcessor

    1
    List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();

    另一个是registryProcessors用来保存BeanDefinitionRegistryPostProcessor

    1
    List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

    BeanDefinitionRegistryPostProcessor扩展了BeanFactoryPostProcessor

    BeanDefinitionRegistryPostProcessor有两个方法,一个是自己的postProcessBeanDefinitionRegistry方法,另一个是父类的postProcessBeanFactory方法。

  3. 循环传进来的beanFactoryPostProcessors,正常情况下beanFactoryPostProcessors肯定是为空的,没有数据的;因为beanFactoryPostProcessors是获得手动添加的,而不是获取spring自动扫描的。只有通过手动调用

    1
    annotationConfigApplicationContext.addBeanFactoryPostProcessor(args);

    才会不为空,获取到数据。

    如果beanFactoryPostProcessors不为空,依次遍历;判断是不是BeanDefinitionRegistryPostProcessor类型,

    1. 如果不是则将遍历出的postProcessor加入到regularPostProcessors中。

      1
      regularPostProcessors.add(postProcessor);
    2. 不是,现将postProcessor强转为BeanDefinitionRegistryPostProcessor类型,然后注册为bean定义,最后加入到registryProcessors集合中

      1
      2
      3
      4
      BeanDefinitionRegistryPostProcessor registryProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor;
      /** 注册bean定义后置处理器 */
      registryProcessor.postProcessBeanDefinitionRegistry(registry);
      registryProcessors.add(registryProcessor);
  4. 定义了一个临时变量currentRegistryProcessors,用来保存BeanDefinitionRegistryPostProcessor

    1
    List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
  5. 拿到所有BeanDefinitioinRegistryPostProcessor类型的bean的名字,将其保存在postProcessornames数组中;然后遍历postProcessorNames数组。判断是不是实现了PriorityOrderd接口,如果实现了进行一下两个操作,否则跳过

    • 从bean工厂获取到BeanDefinitionRegistryPostProcessor实例,将该实例保存到currentRegistryProcessors
    • 将上述步骤获取到的实例名字保存到processedBeans

    ConfigurationClassPostProcessor 是一个很重要的类,这个类实现了BeanDefinitionRegistryPostProcessor接口,而BeanDefinitioinRegistryPostProcessor又实现了BeanFactoryPostProcessor接口。

    ConfigurationClassPostProcessor中会执行扫描@Bean@Import@ImportResource等各种注解

  6. 进行排序,PriorityOrdered是一个排序接口,如果实现了这个排序接口,就说明此后置处理器是有顺序的,需要进行排序操作。

    1
    sortPostProcessors(currentRegistryProcessors, beanFactory);
  7. currentRegistryProcessors合并到registryProcessors,这里合并的原因是因为spring只会执行BeanDefinitionRegistryPostProcessor独有的方法,而不会执行BeanDefinitionRegistryPostProcessor父类的方法,即BeanFactoryProcessor接口中的方法,所以需要把这些后置处理器放入到一个集合中,到后面统一执行BeanFactoryProcessor接口中的方法。

    1
    registryProcessors.addAll(currentRegistryProcessors);
  8. 这里可以是一个扩展点,在这里可以自定义我们的注册逻辑;同时这里也是第一次调用bean定义的后置处理器。

    1
    invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);

    我们进入到这个方法内部看一看

    1
    2
    3
    4
    5
    6
    7
    private static void invokeBeanDefinitionRegistryPostProcessors(Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {
    for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {
    /** 这里调用ConfigutationClassPostProcessor处理beanDefinitionMap中的bean定义 */
    postProcessor.postProcessBeanDefinitionRegistry(registry);
    }
    }

    可以看出来,通过循环依次调用ConfigurationClassPostProcessor处理传进来的registry。不妨在进入到postProcessBeanDefinitionRegistry()方法中看一看。**注意:BeanDefinitionRegistryPostProcessor实现了ConfigurationClassPostProcessor**接口,所以我们这里应该找ConfigurationClassPostProcessor类中的postProcessBeanDefinitionRegistry()方法。如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
    int registryId = System.identityHashCode(registry);
    if (this.registriesPostProcessed.contains(registryId)) {
    throw new IllegalStateException(
    "postProcessBeanDefinitionRegistry already called on this post-processor against " + registry);
    }
    if (this.factoriesPostProcessed.contains(registryId)) {
    throw new IllegalStateException(
    "postProcessBeanFactory already called on this post-processor against " + registry);
    }
    this.registriesPostProcessed.add(registryId);
    /** 这里会解析配置类的一些注解,例如@Configutation@Component@Import等配置注解 */
    processConfigBeanDefinitions(registry);
    }

    这里主要调用了processConfigBeanDefinitions()来解析配置类的一些注解,例如:@Configuration@Component@Import等配置注解。详细解析参考invokeBeanDefinitionRegistryPostProcessors

  9. 清空了临时变量currentRegistryProcessors,因为后面还会使用这个集合变量,所以这里使用完毕之后需要清空,一遍后续使用。

    1
    currentRegistryProcessors.clear();
  10. 再次根据BeanDefinitionRegistryPostProcessor获取BeanName,然后进行循环,判断这个后置处理器有没有被执行过,如果没有被执行过,并且也实现了Ordered接口的话,就把此后置处理器保存在currentRegistryProcessorsprocessedBeans中。

    1
    2
    3
    4
    5
    6
    7
    postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
    for (String ppName : postProcessorNames) {
    if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
    currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
    processedBeans.add(ppName);
    }
    }

    这里我们可以获得我们自己标注了@Component注解的后置处理器了,因为Spring已经完成了扫描,但是这里需要注意的是,由于ConfigurationClassPostProcess在上面已经被执行过了,所以虽然这里可以通过getBeanNamesForType获得,但是并不会加入到currentRegistryProcessorsprocessedBeans中。

  11. 进行排序操作

    1
    sortPostProcessors(currentRegistryProcessors, beanFactory);
  12. 合并Processors,合并理由同7

  13. 执行我们自定义的BeanDefinitionRegistryPostProcessor

    1
    invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
  14. 清空临时变量,同9一样

  15. 在上面的方法中,仅仅是执行了实现Ordered接口的BeanDefinitionRegistryPostProcessor,在这里是执行没有实现Ordered接口的BeanDefinitionRegistryPostProcessor

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    boolean reiterate = true;
    while (reiterate) {
    reiterate = false;
    postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
    for (String ppName : postProcessorNames) {
    if (!processedBeans.contains(ppName)) {
    currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
    processedBeans.add(ppName);
    reiterate = true;
    }
    }
    sortPostProcessors(currentRegistryProcessors, beanFactory);
    registryProcessors.addAll(currentRegistryProcessors);
    /** 第三次调用bean定义后置处理器 */
    invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
    currentRegistryProcessors.clear();
    }
  16. 上面是调用子类独有的方法,这里需要把父类的方法在执行一遍。

    1
    invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);

    这个方法的调用链很深,其实他最终会去执行ConfigurationClassPostProcessor类中的postProcessBeanFactory()方法。

    ConfigurationClassPostProcessor#postPRocessBeanFactory

    • postProcessBeanFactory()方法中回调了processConfigurationBeanDefinitions((BeanDefinitionRegistry) beanFactory)方法来解析了@Component@Configuration等注解
    • 调用enhanceConfigurationClasses(beanFactory)来进行CGLIB代理,这里只会代理配置类为Full的类
    • 然后向beanFactory中添加一个ImportAwareBeanPostProcessor后置处理器
  17. 再一次调用invokeBeanFactoryPostProcessors,执行BeanFactoryPostProcessor的方法,但是这里regularPostProcessors一般情况下是不会有数据的,只有在外部通过手动添加BeanFactoryPostProcessor,才会有数据。

  18. 查找实现了BeanFactoryPostProcessor的后置处理器,并且执行后置处理器方法。下面的逻辑和上面的步骤类似,这里就不在列举了

    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
    /** 这里不进行初始化FactoryBeans,而是让bean工厂后置处理器去初始化这些常规的bean */
    String[] postProcessorNames =
    beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

    // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,Ordered, and the rest.
    /** 分离出 orderedPostProcessorNames 和nonOrderedPostProcessorNames */
    List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    List<String> orderedPostProcessorNames = new ArrayList<>();
    List<String> nonOrderedPostProcessorNames = new ArrayList<>();
    /**
    * 循环BeanNames
    */
    for (String ppName : postProcessorNames) {
    /**
    * 如果这个bean被执行过了,则跳过不执行
    */
    if (processedBeans.contains(ppName)) {
    // skip - already processed in first phase above
    }
    /**
    * 如果bean实现了PriorityOrdered接口,则加入到priorityOrderedPostProcessors
    */
    else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
    priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
    }
    /**
    * 如果bean实现了Ordered接口,则加入到orderedPostProcessorNames
    */
    else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
    orderedPostProcessorNames.add(ppName);
    }
    /**
    * 既没有实现PriorityOrdered接口,也没有实现Ordered接口,则加入到nonOrderedPostProcessorNames
    */
    else {
    nonOrderedPostProcessorNames.add(ppName);
    }
    }

    // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
    /**
    * 1、调用实现PriorityOrdered接口的bean工厂后置处理器
    * 排序处理priorityOrderedPostProcessors,即实现了PriorityOrdered接口的BeanFactoryPostProcessor
    */
    sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    /**
    * 执行priorityOrderedPostProcessor
    */
    invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

    // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
    /**
    * 2、调用实现Ordered接口实现的bean后置处理器
    * 执行实现了Ordered接口的BeanFactoryPostProcessor
    */
    List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
    for (String postProcessorName : orderedPostProcessorNames) {
    orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    }
    sortPostProcessors(orderedPostProcessors, beanFactory);
    invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

    // Finally, invoke all other BeanFactoryPostProcessors.
    /**
    * 3、调用其他所有的bean后置处理器
    * 执行既没有实现PriorityOrdered接口也没有实现Ordered接口的BeanFactoryPostProcessor
    */
    List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
    for (String postProcessorName : nonOrderedPostProcessorNames) {
    nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    }
    /** 这里会调用EventListenerMethodProcessor.postProcessBeanFactory(),注册事件监听器后置处理器 */
    invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

    // Clear cached merged bean definitions since the post-processors might have
    // modified the original metadata, e.g. replacing placeholders in values...
    beanFactory.clearMetadataCache();

    最后附上invokeBeanFactoryPostProcessor方法中执行流程图,结合历程图更容易理解整个流程

    IOC加载流程-invokeBeanFactoryPostProcessor

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信