11/*
2- * Copyright 2002-2014 the original author or authors.
2+ * Copyright 2002-2015 the original author or authors.
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License");
55 * you may not use this file except in compliance with the License.
1717package org .springframework .context .annotation ;
1818
1919import java .beans .PropertyDescriptor ;
20+ import java .util .ArrayList ;
2021import java .util .Arrays ;
22+ import java .util .Collections ;
23+ import java .util .Comparator ;
2124import java .util .HashSet ;
2225import java .util .LinkedHashMap ;
2326import java .util .LinkedHashSet ;
27+ import java .util .List ;
2428import java .util .Map ;
2529import java .util .Set ;
2630
@@ -264,7 +268,7 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
264268 * {@link Configuration} classes.
265269 */
266270 public void processConfigBeanDefinitions (BeanDefinitionRegistry registry ) {
267- Set <BeanDefinitionHolder > configCandidates = new LinkedHashSet <BeanDefinitionHolder >();
271+ List <BeanDefinitionHolder > configCandidates = new ArrayList <BeanDefinitionHolder >();
268272 String [] candidateNames = registry .getBeanDefinitionNames ();
269273
270274 for (String beanName : candidateNames ) {
@@ -285,6 +289,16 @@ else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.
285289 return ;
286290 }
287291
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+
288302 // Detect any custom bean name generation strategy supplied through the enclosing application context
289303 SingletonBeanRegistry singletonRegistry = null ;
290304 if (registry instanceof SingletonBeanRegistry ) {
@@ -301,9 +315,10 @@ else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.
301315 this .metadataReaderFactory , this .problemReporter , this .environment ,
302316 this .resourceLoader , this .componentScanBeanNameGenerator , registry );
303317
318+ Set <BeanDefinitionHolder > candidates = new LinkedHashSet <BeanDefinitionHolder >(configCandidates );
304319 Set <ConfigurationClass > alreadyParsed = new HashSet <ConfigurationClass >(configCandidates .size ());
305320 do {
306- parser .parse (configCandidates );
321+ parser .parse (candidates );
307322 parser .validate ();
308323
309324 Set <ConfigurationClass > configClasses = new LinkedHashSet <ConfigurationClass >(parser .getConfigurationClasses ());
@@ -318,7 +333,7 @@ else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.
318333 this .reader .loadBeanDefinitions (configClasses );
319334 alreadyParsed .addAll (configClasses );
320335
321- configCandidates .clear ();
336+ candidates .clear ();
322337 if (registry .getBeanDefinitionCount () > candidateNames .length ) {
323338 String [] newCandidateNames = registry .getBeanDefinitionNames ();
324339 Set <String > oldCandidateNames = new HashSet <String >(Arrays .asList (candidateNames ));
@@ -331,14 +346,14 @@ else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.
331346 BeanDefinition beanDef = registry .getBeanDefinition (candidateName );
332347 if (ConfigurationClassUtils .checkConfigurationClassCandidate (beanDef , this .metadataReaderFactory ) &&
333348 !alreadyParsedClasses .contains (beanDef .getBeanClassName ())) {
334- configCandidates .add (new BeanDefinitionHolder (beanDef , candidateName ));
349+ candidates .add (new BeanDefinitionHolder (beanDef , candidateName ));
335350 }
336351 }
337352 }
338353 candidateNames = newCandidateNames ;
339354 }
340355 }
341- while (!configCandidates .isEmpty ());
356+ while (!candidates .isEmpty ());
342357
343358 // Register the ImportRegistry as a bean in order to support ImportAware @Configuration classes
344359 if (singletonRegistry != null ) {
0 commit comments