From 70b5f319a956d2d6a89ac316c51e566a93856468 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 17 Sep 2014 21:39:38 -0700 Subject: [PATCH] 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 --- .../annotation/ConditionEvaluator.java | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConditionEvaluator.java b/spring-context/src/main/java/org/springframework/context/annotation/ConditionEvaluator.java index fe33694a0a..86dc06eba2 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConditionEvaluator.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConditionEvaluator.java @@ -16,6 +16,7 @@ package org.springframework.context.annotation; +import java.util.ArrayList; import java.util.Collections; 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.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ConfigurationCondition.ConfigurationPhase; +import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.env.Environment; import org.springframework.core.env.EnvironmentCapable; import org.springframework.core.io.ResourceLoader; @@ -81,17 +83,24 @@ class ConditionEvaluator { return shouldSkip(metadata, ConfigurationPhase.REGISTER_BEAN); } + List conditions = new ArrayList(); for (String[] conditionClasses : getConditionClasses(metadata)) { for (String conditionClass : conditionClasses) { Condition condition = getCondition(conditionClass, this.context.getClassLoader()); - ConfigurationPhase requiredPhase = null; - if (condition instanceof ConfigurationCondition) { - requiredPhase = ((ConfigurationCondition) condition).getConfigurationPhase(); - } - if (requiredPhase == null || requiredPhase == phase) { - if (!condition.matches(this.context, metadata)) { - return true; - } + conditions.add(condition); + } + } + + Collections.sort(conditions, AnnotationAwareOrderComparator.INSTANCE); + + 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; } } }