diff --git a/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java b/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java index f67ebf2884..85c6bb7b93 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java @@ -36,6 +36,8 @@ import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.bind.PropertiesConfigurationFactory; +import org.springframework.boot.bind.PropertySourcesPropertyValues; +import org.springframework.boot.bind.RelaxedDataBinder; import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; import org.springframework.boot.context.event.ApplicationPreparedEvent; @@ -55,6 +57,7 @@ import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.EnumerablePropertySource; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.PropertySource; +import org.springframework.core.env.PropertySources; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; @@ -390,8 +393,8 @@ public class ConfigFileApplicationListener implements EnvironmentPostProcessor, } // Any pre-existing active profiles set via property sources (e.g. System // properties) take precedence over those added in config files. - Set activeProfiles = getProfilesForValue( - this.environment.getProperty(ACTIVE_PROFILES_PROPERTY)); + Set activeProfiles = bindSpringProfiles( + this.environment.getPropertySources()).getActiveProfiles(); maybeActivateProfiles(activeProfiles); return activeProfiles; } @@ -506,12 +509,23 @@ public class ConfigFileApplicationListener implements EnvironmentPostProcessor, } private void handleProfileProperties(PropertySource propertySource) { - Set activeProfiles = getProfilesForValue( - propertySource.getProperty(ACTIVE_PROFILES_PROPERTY)); - maybeActivateProfiles(activeProfiles); - Set includeProfiles = getProfilesForValue( - propertySource.getProperty(INCLUDE_PROFILES_PROPERTY)); - addProfiles(includeProfiles); + SpringProfiles springProfiles = bindSpringProfiles(propertySource); + maybeActivateProfiles(springProfiles.getActiveProfiles()); + addProfiles(springProfiles.getIncludeProfiles()); + } + + private SpringProfiles bindSpringProfiles(PropertySource propertySource) { + MutablePropertySources propertySources = new MutablePropertySources(); + propertySources.addFirst(propertySource); + return bindSpringProfiles(propertySources); + } + + private SpringProfiles bindSpringProfiles(PropertySources propertySources) { + SpringProfiles springProfiles = new SpringProfiles(); + RelaxedDataBinder dataBinder = new RelaxedDataBinder(springProfiles, + "spring.profiles"); + dataBinder.bind(new PropertySourcesPropertyValues(propertySources)); + return springProfiles; } private void maybeActivateProfiles(Set profiles) { @@ -540,16 +554,6 @@ public class ConfigFileApplicationListener implements EnvironmentPostProcessor, } } - private Set getProfilesForValue(Object property) { - String value = (property == null ? null : property.toString()); - Set profileNames = asResolvedSet(value, null); - Set profiles = new LinkedHashSet(); - for (String profileName : profileNames) { - profiles.add(new Profile(profileName)); - } - return profiles; - } - private void addProfiles(Set profiles) { for (Profile profile : profiles) { this.profiles.add(profile); @@ -750,4 +754,48 @@ public class ConfigFileApplicationListener implements EnvironmentPostProcessor, } + /** + * Holder for {@code spring.profiles} properties. + */ + static final class SpringProfiles { + + private List active = new ArrayList(); + + private List include = new ArrayList(); + + public List getActive() { + return this.active; + } + + public void setActive(List active) { + this.active = active; + } + + public List getInclude() { + return this.include; + } + + public void setInclude(List include) { + this.include = include; + } + + Set getActiveProfiles() { + return asProfileSet(this.active); + } + + Set getIncludeProfiles() { + return asProfileSet(this.include); + } + + private Set asProfileSet(List profileNames) { + List profiles = new ArrayList(); + for (String profileName : profileNames) { + profiles.add(new Profile(profileName)); + } + Collections.reverse(profiles); + return new LinkedHashSet(profiles); + } + + } + }