1
1
/*
2
- * Copyright 2002-2014 the original author or authors.
2
+ * Copyright 2002-2015 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
17
17
package org .springframework .context .annotation ;
18
18
19
19
import java .beans .PropertyDescriptor ;
20
+ import java .util .ArrayList ;
20
21
import java .util .Arrays ;
22
+ import java .util .Collections ;
23
+ import java .util .Comparator ;
21
24
import java .util .HashSet ;
22
25
import java .util .LinkedHashMap ;
23
26
import java .util .LinkedHashSet ;
27
+ import java .util .List ;
24
28
import java .util .Map ;
25
29
import java .util .Set ;
26
30
@@ -264,7 +268,7 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
264
268
* {@link Configuration} classes.
265
269
*/
266
270
public void processConfigBeanDefinitions (BeanDefinitionRegistry registry ) {
267
- Set <BeanDefinitionHolder > configCandidates = new LinkedHashSet <BeanDefinitionHolder >();
271
+ List <BeanDefinitionHolder > configCandidates = new ArrayList <BeanDefinitionHolder >();
268
272
String [] candidateNames = registry .getBeanDefinitionNames ();
269
273
270
274
for (String beanName : candidateNames ) {
@@ -285,6 +289,16 @@ else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.
285
289
return ;
286
290
}
287
291
292
+ // Sort by previously determined @Order value, if applicable
293
+ Collections .sort (configCandidates , new Comparator <BeanDefinitionHolder >() {
294
+ @ Override
295
+ public int compare (BeanDefinitionHolder bd1 , BeanDefinitionHolder bd2 ) {
296
+ int i1 = ConfigurationClassUtils .getOrder (bd1 .getBeanDefinition ());
297
+ int i2 = ConfigurationClassUtils .getOrder (bd2 .getBeanDefinition ());
298
+ return (i1 < i2 ) ? -1 : (i1 > i2 ) ? 1 : 0 ;
299
+ }
300
+ });
301
+
288
302
// Detect any custom bean name generation strategy supplied through the enclosing application context
289
303
SingletonBeanRegistry singletonRegistry = null ;
290
304
if (registry instanceof SingletonBeanRegistry ) {
@@ -301,9 +315,10 @@ else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.
301
315
this .metadataReaderFactory , this .problemReporter , this .environment ,
302
316
this .resourceLoader , this .componentScanBeanNameGenerator , registry );
303
317
318
+ Set <BeanDefinitionHolder > candidates = new LinkedHashSet <BeanDefinitionHolder >(configCandidates );
304
319
Set <ConfigurationClass > alreadyParsed = new HashSet <ConfigurationClass >(configCandidates .size ());
305
320
do {
306
- parser .parse (configCandidates );
321
+ parser .parse (candidates );
307
322
parser .validate ();
308
323
309
324
Set <ConfigurationClass > configClasses = new LinkedHashSet <ConfigurationClass >(parser .getConfigurationClasses ());
@@ -318,7 +333,7 @@ else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.
318
333
this .reader .loadBeanDefinitions (configClasses );
319
334
alreadyParsed .addAll (configClasses );
320
335
321
- configCandidates .clear ();
336
+ candidates .clear ();
322
337
if (registry .getBeanDefinitionCount () > candidateNames .length ) {
323
338
String [] newCandidateNames = registry .getBeanDefinitionNames ();
324
339
Set <String > oldCandidateNames = new HashSet <String >(Arrays .asList (candidateNames ));
@@ -331,14 +346,14 @@ else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.
331
346
BeanDefinition beanDef = registry .getBeanDefinition (candidateName );
332
347
if (ConfigurationClassUtils .checkConfigurationClassCandidate (beanDef , this .metadataReaderFactory ) &&
333
348
!alreadyParsedClasses .contains (beanDef .getBeanClassName ())) {
334
- configCandidates .add (new BeanDefinitionHolder (beanDef , candidateName ));
349
+ candidates .add (new BeanDefinitionHolder (beanDef , candidateName ));
335
350
}
336
351
}
337
352
}
338
353
candidateNames = newCandidateNames ;
339
354
}
340
355
}
341
- while (!configCandidates .isEmpty ());
356
+ while (!candidates .isEmpty ());
342
357
343
358
// Register the ImportRegistry as a bean in order to support ImportAware @Configuration classes
344
359
if (singletonRegistry != null ) {
0 commit comments