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. 25
      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,17 +83,24 @@ 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());
ConfigurationPhase requiredPhase = null; conditions.add(condition);
if (condition instanceof ConfigurationCondition) { }
requiredPhase = ((ConfigurationCondition) condition).getConfigurationPhase(); }
}
if (requiredPhase == null || requiredPhase == phase) { Collections.sort(conditions, AnnotationAwareOrderComparator.INSTANCE);
if (!condition.matches(this.context, metadata)) {
return true; for (Condition condition : conditions) {
} ConfigurationPhase requiredPhase = null;
if (condition instanceof ConfigurationCondition) {
requiredPhase = ((ConfigurationCondition) condition).getConfigurationPhase();
}
if (requiredPhase == null || requiredPhase == phase) {
if (!condition.matches(this.context, metadata)) {
return true;
} }
} }
} }

Loading…
Cancel
Save