Support @Ordering of Conditions

Update ConditionEvaluator to collect then sort Conditions before
evaluation. By annotating Conditions with @Ordered expensive operations
can be pushed to the back of the queue.

Issue: SPR-12219
master
Phillip Webb 10 years ago
parent a833889c2a
commit 70b5f319a9
  1. 11
      spring-context/src/main/java/org/springframework/context/annotation/ConditionEvaluator.java

@ -16,6 +16,7 @@
package org.springframework.context.annotation; package org.springframework.context.annotation;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -24,6 +25,7 @@ import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ConfigurationCondition.ConfigurationPhase; import org.springframework.context.annotation.ConfigurationCondition.ConfigurationPhase;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.core.env.EnvironmentCapable; import org.springframework.core.env.EnvironmentCapable;
import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.ResourceLoader;
@ -81,9 +83,17 @@ class ConditionEvaluator {
return shouldSkip(metadata, ConfigurationPhase.REGISTER_BEAN); return shouldSkip(metadata, ConfigurationPhase.REGISTER_BEAN);
} }
List<Condition> conditions = new ArrayList<Condition>();
for (String[] conditionClasses : getConditionClasses(metadata)) { for (String[] conditionClasses : getConditionClasses(metadata)) {
for (String conditionClass : conditionClasses) { for (String conditionClass : conditionClasses) {
Condition condition = getCondition(conditionClass, this.context.getClassLoader()); Condition condition = getCondition(conditionClass, this.context.getClassLoader());
conditions.add(condition);
}
}
Collections.sort(conditions, AnnotationAwareOrderComparator.INSTANCE);
for (Condition condition : conditions) {
ConfigurationPhase requiredPhase = null; ConfigurationPhase requiredPhase = null;
if (condition instanceof ConfigurationCondition) { if (condition instanceof ConfigurationCondition) {
requiredPhase = ((ConfigurationCondition) condition).getConfigurationPhase(); requiredPhase = ((ConfigurationCondition) condition).getConfigurationPhase();
@ -94,7 +104,6 @@ class ConditionEvaluator {
} }
} }
} }
}
return false; return false;
} }

Loading…
Cancel
Save