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