@@ -59,15 +59,14 @@ public static void invokeBeanFactoryPostProcessors(
59
59
if (beanFactory instanceof BeanDefinitionRegistry ) {
60
60
BeanDefinitionRegistry registry = (BeanDefinitionRegistry ) beanFactory ;
61
61
List <BeanFactoryPostProcessor > regularPostProcessors = new LinkedList <>();
62
- List <BeanDefinitionRegistryPostProcessor > registryPostProcessors =
63
- new LinkedList <>();
62
+ List <BeanDefinitionRegistryPostProcessor > registryProcessors = new LinkedList <>();
64
63
65
64
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors ) {
66
65
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor ) {
67
- BeanDefinitionRegistryPostProcessor registryPostProcessor =
66
+ BeanDefinitionRegistryPostProcessor registryProcessor =
68
67
(BeanDefinitionRegistryPostProcessor ) postProcessor ;
69
- registryPostProcessor .postProcessBeanDefinitionRegistry (registry );
70
- registryPostProcessors .add (registryPostProcessor );
68
+ registryProcessor .postProcessBeanDefinitionRegistry (registry );
69
+ registryProcessors .add (registryProcessor );
71
70
}
72
71
else {
73
72
regularPostProcessors .add (postProcessor );
@@ -78,33 +77,34 @@ public static void invokeBeanFactoryPostProcessors(
78
77
// uninitialized to let the bean factory post-processors apply to them!
79
78
// Separate between BeanDefinitionRegistryPostProcessors that implement
80
79
// PriorityOrdered, Ordered, and the rest.
81
- String [] postProcessorNames =
82
- beanFactory .getBeanNamesForType (BeanDefinitionRegistryPostProcessor .class , true , false );
80
+ List <BeanDefinitionRegistryPostProcessor > currentRegistryProcessors = new ArrayList <>();
83
81
84
82
// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
85
- List <BeanDefinitionRegistryPostProcessor > priorityOrderedPostProcessors = new ArrayList <>();
83
+ String [] postProcessorNames =
84
+ beanFactory .getBeanNamesForType (BeanDefinitionRegistryPostProcessor .class , true , false );
86
85
for (String ppName : postProcessorNames ) {
87
86
if (beanFactory .isTypeMatch (ppName , PriorityOrdered .class )) {
88
- priorityOrderedPostProcessors .add (beanFactory .getBean (ppName , BeanDefinitionRegistryPostProcessor .class ));
87
+ currentRegistryProcessors .add (beanFactory .getBean (ppName , BeanDefinitionRegistryPostProcessor .class ));
89
88
processedBeans .add (ppName );
90
89
}
91
90
}
92
- sortPostProcessors (beanFactory , priorityOrderedPostProcessors );
93
- registryPostProcessors .addAll (priorityOrderedPostProcessors );
94
- invokeBeanDefinitionRegistryPostProcessors (priorityOrderedPostProcessors , registry );
91
+ sortPostProcessors (currentRegistryProcessors , beanFactory );
92
+ registryProcessors .addAll (currentRegistryProcessors );
93
+ invokeBeanDefinitionRegistryPostProcessors (currentRegistryProcessors , registry );
94
+ currentRegistryProcessors .clear ();
95
95
96
96
// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
97
97
postProcessorNames = beanFactory .getBeanNamesForType (BeanDefinitionRegistryPostProcessor .class , true , false );
98
- List <BeanDefinitionRegistryPostProcessor > orderedPostProcessors = new ArrayList <>();
99
98
for (String ppName : postProcessorNames ) {
100
99
if (!processedBeans .contains (ppName ) && beanFactory .isTypeMatch (ppName , Ordered .class )) {
101
- orderedPostProcessors .add (beanFactory .getBean (ppName , BeanDefinitionRegistryPostProcessor .class ));
100
+ currentRegistryProcessors .add (beanFactory .getBean (ppName , BeanDefinitionRegistryPostProcessor .class ));
102
101
processedBeans .add (ppName );
103
102
}
104
103
}
105
- sortPostProcessors (beanFactory , orderedPostProcessors );
106
- registryPostProcessors .addAll (orderedPostProcessors );
107
- invokeBeanDefinitionRegistryPostProcessors (orderedPostProcessors , registry );
104
+ sortPostProcessors (currentRegistryProcessors , beanFactory );
105
+ registryProcessors .addAll (currentRegistryProcessors );
106
+ invokeBeanDefinitionRegistryPostProcessors (currentRegistryProcessors , registry );
107
+ currentRegistryProcessors .clear ();
108
108
109
109
// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
110
110
boolean reiterate = true ;
@@ -113,17 +113,19 @@ public static void invokeBeanFactoryPostProcessors(
113
113
postProcessorNames = beanFactory .getBeanNamesForType (BeanDefinitionRegistryPostProcessor .class , true , false );
114
114
for (String ppName : postProcessorNames ) {
115
115
if (!processedBeans .contains (ppName )) {
116
- BeanDefinitionRegistryPostProcessor pp = beanFactory .getBean (ppName , BeanDefinitionRegistryPostProcessor .class );
117
- registryPostProcessors .add (pp );
116
+ currentRegistryProcessors .add (beanFactory .getBean (ppName , BeanDefinitionRegistryPostProcessor .class ));
118
117
processedBeans .add (ppName );
119
- pp .postProcessBeanDefinitionRegistry (registry );
120
118
reiterate = true ;
121
119
}
122
120
}
121
+ sortPostProcessors (currentRegistryProcessors , beanFactory );
122
+ registryProcessors .addAll (currentRegistryProcessors );
123
+ invokeBeanDefinitionRegistryPostProcessors (currentRegistryProcessors , registry );
124
+ currentRegistryProcessors .clear ();
123
125
}
124
126
125
127
// Now, invoke the postProcessBeanFactory callback of all processors handled so far.
126
- invokeBeanFactoryPostProcessors (registryPostProcessors , beanFactory );
128
+ invokeBeanFactoryPostProcessors (registryProcessors , beanFactory );
127
129
invokeBeanFactoryPostProcessors (regularPostProcessors , beanFactory );
128
130
}
129
131
@@ -158,15 +160,15 @@ else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
158
160
}
159
161
160
162
// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
161
- sortPostProcessors (beanFactory , priorityOrderedPostProcessors );
163
+ sortPostProcessors (priorityOrderedPostProcessors , beanFactory );
162
164
invokeBeanFactoryPostProcessors (priorityOrderedPostProcessors , beanFactory );
163
165
164
166
// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
165
167
List <BeanFactoryPostProcessor > orderedPostProcessors = new ArrayList <>();
166
168
for (String postProcessorName : orderedPostProcessorNames ) {
167
169
orderedPostProcessors .add (beanFactory .getBean (postProcessorName , BeanFactoryPostProcessor .class ));
168
170
}
169
- sortPostProcessors (beanFactory , orderedPostProcessors );
171
+ sortPostProcessors (orderedPostProcessors , beanFactory );
170
172
invokeBeanFactoryPostProcessors (orderedPostProcessors , beanFactory );
171
173
172
174
// Finally, invoke all other BeanFactoryPostProcessors.
@@ -215,7 +217,7 @@ else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
215
217
}
216
218
217
219
// First, register the BeanPostProcessors that implement PriorityOrdered.
218
- sortPostProcessors (beanFactory , priorityOrderedPostProcessors );
220
+ sortPostProcessors (priorityOrderedPostProcessors , beanFactory );
219
221
registerBeanPostProcessors (beanFactory , priorityOrderedPostProcessors );
220
222
221
223
// Next, register the BeanPostProcessors that implement Ordered.
@@ -227,7 +229,7 @@ else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
227
229
internalPostProcessors .add (pp );
228
230
}
229
231
}
230
- sortPostProcessors (beanFactory , orderedPostProcessors );
232
+ sortPostProcessors (orderedPostProcessors , beanFactory );
231
233
registerBeanPostProcessors (beanFactory , orderedPostProcessors );
232
234
233
235
// Now, register all regular BeanPostProcessors.
@@ -242,15 +244,15 @@ else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
242
244
registerBeanPostProcessors (beanFactory , nonOrderedPostProcessors );
243
245
244
246
// Finally, re-register all internal BeanPostProcessors.
245
- sortPostProcessors (beanFactory , internalPostProcessors );
247
+ sortPostProcessors (internalPostProcessors , beanFactory );
246
248
registerBeanPostProcessors (beanFactory , internalPostProcessors );
247
249
248
250
// Re-register post-processor for detecting inner beans as ApplicationListeners,
249
251
// moving it to the end of the processor chain (for picking up proxies etc).
250
252
beanFactory .addBeanPostProcessor (new ApplicationListenerDetector (applicationContext ));
251
253
}
252
254
253
- private static void sortPostProcessors (ConfigurableListableBeanFactory beanFactory , List <?> postProcessors ) {
255
+ private static void sortPostProcessors (List <?> postProcessors , ConfigurableListableBeanFactory beanFactory ) {
254
256
Comparator <Object > comparatorToUse = null ;
255
257
if (beanFactory instanceof DefaultListableBeanFactory ) {
256
258
comparatorToUse = ((DefaultListableBeanFactory ) beanFactory ).getDependencyComparator ();
0 commit comments