diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/BootstrapApplicationListener.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/BootstrapApplicationListener.java index 005b8a34..efbe7839 100644 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/BootstrapApplicationListener.java +++ b/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/BootstrapApplicationListener.java @@ -179,7 +179,7 @@ public class BootstrapApplicationListener implements } private static class AncestorInitializer implements - ApplicationContextInitializer { + ApplicationContextInitializer, Ordered { private ConfigurableApplicationContext parent; @@ -191,6 +191,14 @@ public class BootstrapApplicationListener implements this.parent = parent; } + @Override + public int getOrder() { + // Need to run not too late (so not unordered), so that, for instance, the + // ContextIdApplicationContextInitializer runs later and picks up the merged + // Environment + return 0; + } + @Override public void initialize(ConfigurableApplicationContext context) { preemptMerge( diff --git a/spring-cloud-config-client/src/test/java/org/springframework/cloud/bootstrap/BootstrapConfigurationTests.java b/spring-cloud-config-client/src/test/java/org/springframework/cloud/bootstrap/BootstrapConfigurationTests.java index 0e0a2be1..495ded2b 100644 --- a/spring-cloud-config-client/src/test/java/org/springframework/cloud/bootstrap/BootstrapConfigurationTests.java +++ b/spring-cloud-config-client/src/test/java/org/springframework/cloud/bootstrap/BootstrapConfigurationTests.java @@ -28,6 +28,7 @@ import org.junit.After; import org.junit.Test; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.config.client.ConfigClientProperties; import org.springframework.cloud.config.client.PropertySourceLocator; import org.springframework.context.ConfigurableApplicationContext; @@ -57,7 +58,7 @@ public class BootstrapConfigurationTests { @Test public void picksUpAdditionalPropertySource() { - System.setProperty("expected.name","app"); + System.setProperty("expected.name", "bootstrap"); context = new SpringApplicationBuilder().web(false) .sources(BareConfiguration.class).run(); assertEquals("bar", context.getEnvironment().getProperty("bootstrap.foo")); @@ -66,11 +67,13 @@ public class BootstrapConfigurationTests { } @Test - public void applicationNameIsNotBootstrap() { - System.setProperty("expected.name","app"); - context = new SpringApplicationBuilder().web(false) - .properties("spring.cloud.bootstrap.name:other") - .sources(BareConfiguration.class).run(); + public void applicationNameInBootstrapAndMain() { + System.setProperty("expected.name", "main"); + context = new SpringApplicationBuilder() + .web(false) + .properties("spring.cloud.bootstrap.name:other", + "spring.config.name:plain").sources(BareConfiguration.class) + .run(); assertEquals("app", context.getEnvironment().getProperty("spring.application.name")); // The parent is called "main" because spring.application.name is specified in @@ -83,26 +86,46 @@ public class BootstrapConfigurationTests { assertNotSame(context.getEnvironment().getPropertySources().get("bootstrap"), ((ConfigurableEnvironment) context.getParent().getEnvironment()) .getPropertySources().get("bootstrap")); + assertEquals("app", context.getId()); } @Test public void applicationNameNotInBootstrap() { - System.setProperty("expected.name","main"); + System.setProperty("expected.name", "main"); context = new SpringApplicationBuilder() .web(false) - .properties("spring.cloud.bootstrap.name:plain", + .properties("spring.cloud.bootstrap.name:application", "spring.config.name:other").sources(BareConfiguration.class) .run(); assertEquals("main", context.getEnvironment().getProperty("spring.application.name")); - // The parent is called "plain" because spring.application.name is specified in - // other.properties (the application properties this time) + // The parent is called "application" because spring.application.name is not + // defined in the bootstrap properties assertEquals( - "plain", + "application", context.getParent().getEnvironment() .getProperty("spring.application.name")); } + @Test + public void applicationNameOnlyInBootstrap() { + System.setProperty("expected.name", "main"); + context = new SpringApplicationBuilder().web(false) + .properties("spring.cloud.bootstrap.name:other") + .sources(BareConfiguration.class).run(); + // The main context is called "main" because spring.application.name is specified + // in other.properties (and not in the main config file) + assertEquals("main", + context.getEnvironment().getProperty("spring.application.name")); + // The parent is called "main" because spring.application.name is specified in + // other.properties (the bootstrap properties this time) + assertEquals( + "main", + context.getParent().getEnvironment() + .getProperty("spring.application.name")); + assertEquals("main", context.getId()); + } + @Test public void environmentEnrichedOnceWhenSharedWithChildContext() { context = new SpringApplicationBuilder().sources(BareConfiguration.class) @@ -155,6 +178,7 @@ public class BootstrapConfigurationTests { } @Configuration + @EnableConfigurationProperties(ConfigClientProperties.class) protected static class BareConfiguration { } @@ -164,7 +188,7 @@ public class BootstrapConfigurationTests { protected static class PropertySourceConfiguration implements PropertySourceLocator { private String name; - + @Override public PropertySource locate(Environment environment) { if (name != null) { diff --git a/spring-cloud-config-client/src/test/resources/application.properties b/spring-cloud-config-client/src/test/resources/application.properties index 4931409b..9999b13c 100644 --- a/spring-cloud-config-client/src/test/resources/application.properties +++ b/spring-cloud-config-client/src/test/resources/application.properties @@ -1,4 +1,3 @@ -spring.application.name: app message: Hello scope! delay: 0 # debug: true \ No newline at end of file diff --git a/spring-cloud-config-client/src/test/resources/plain.properties b/spring-cloud-config-client/src/test/resources/plain.properties index e69de29b..aa8f5408 100644 --- a/spring-cloud-config-client/src/test/resources/plain.properties +++ b/spring-cloud-config-client/src/test/resources/plain.properties @@ -0,0 +1 @@ +spring.application.name: app