diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironment.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironment.java index 77abf8d2d9d..47d400302b1 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironment.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironment.java @@ -57,6 +57,7 @@ import org.springframework.util.StringUtils; * * @author Phillip Webb * @author Madhura Bhave + * @author Nan Chiu */ class ConfigDataEnvironment { @@ -211,14 +212,17 @@ class ConfigDataEnvironment { private void addInitialImportContributors(List initialContributors, ConfigDataLocation[] locations) { - for (int i = locations.length - 1; i >= 0; i--) { - initialContributors.add(createInitialImportContributor(locations[i])); - } + addInitialImportContributors(initialContributors, List.of(locations)); } - private ConfigDataEnvironmentContributor createInitialImportContributor(ConfigDataLocation location) { - this.logger.trace(LogMessage.format("Adding initial config data import from location '%s'", location)); - return ConfigDataEnvironmentContributor.ofInitialImport(location, this.environment.getConversionService()); + private void addInitialImportContributors(List initialContributors, + List locations) { + if (!locations.isEmpty()) { + this.logger.trace(LogMessage.format("Adding initial config data import from locations %s", locations)); + ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImports(locations, + this.environment.getConversionService()); + initialContributors.add(contributor); + } } /** diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributor.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributor.java index 3c85a5b9ed9..1b83d161069 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributor.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributor.java @@ -52,6 +52,7 @@ import org.springframework.util.CollectionUtils; * * @author Phillip Webb * @author Madhura Bhave + * @author Nan Chiu */ class ConfigDataEnvironmentContributor implements Iterable { @@ -392,14 +393,13 @@ class ConfigDataEnvironmentContributor implements Iterable initialImports, ConversionService conversionService) { - List imports = Collections.singletonList(initialImport); - ConfigDataProperties properties = new ConfigDataProperties(imports, null); + ConfigDataProperties properties = new ConfigDataProperties(initialImports, null); return new ConfigDataEnvironmentContributor(Kind.INITIAL_IMPORT, null, null, false, null, null, properties, null, null, conversionService); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorTests.java index 998f7f28598..34d454f20f0 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorTests.java @@ -44,11 +44,14 @@ import static org.mockito.Mockito.mock; * @author Phillip Webb * @author Madhura Bhave * @author Scott Frederick + * @author Nan Chiu */ class ConfigDataEnvironmentContributorTests { private static final ConfigDataLocation TEST_LOCATION = ConfigDataLocation.of("test"); + private static final List TEST_LOCATIONS = List.of(TEST_LOCATION); + private final ConfigDataActivationContext activationContext = new ConfigDataActivationContext( CloudPlatform.KUBERNETES, null); @@ -56,14 +59,14 @@ class ConfigDataEnvironmentContributorTests { @Test void getKindReturnsKind() { - ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(TEST_LOCATION, + ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImports(TEST_LOCATIONS, this.conversionService); assertThat(contributor.getKind()).isEqualTo(Kind.INITIAL_IMPORT); } @Test void isActiveWhenPropertiesIsNullReturnsTrue() { - ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(TEST_LOCATION, + ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImports(TEST_LOCATIONS, this.conversionService); assertThat(contributor.isActive(null)).isTrue(); } @@ -286,12 +289,12 @@ class ConfigDataEnvironmentContributorTests { } @Test - void ofInitialImportCreatedInitialImportContributor() { - ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(TEST_LOCATION, + void ofInitialImportsCreatedInitialImportContributor() { + ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImports(TEST_LOCATIONS, this.conversionService); assertThat(contributor.getKind()).isEqualTo(Kind.INITIAL_IMPORT); assertThat(contributor.getResource()).isNull(); - assertThat(contributor.getImports()).containsExactly(TEST_LOCATION); + assertThat(contributor.getImports()).isEqualTo(TEST_LOCATIONS); assertThat(contributor.isActive(this.activationContext)).isTrue(); assertThat(contributor.getPropertySource()).isNull(); assertThat(contributor.getConfigurationPropertySource()).isNull(); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorsTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorsTests.java index 3dd1855a969..dd4db331b55 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorsTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorsTests.java @@ -91,8 +91,8 @@ class ConfigDataEnvironmentContributorsTests { @Test void createCreatesWithInitialContributors() { - ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1, - this.conversionService); + ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor + .ofInitialImports(List.of(LOCATION_1), this.conversionService); ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory, this.bootstrapContext, List.of(contributor), this.conversionService, ConfigDataEnvironmentUpdateListener.NONE); @@ -123,8 +123,8 @@ class ConfigDataEnvironmentContributorsTests { new ConfigData(List.of(propertySource))); given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(locations))) .willReturn(imported); - ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1, - this.conversionService); + ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor + .ofInitialImports(List.of(LOCATION_1), this.conversionService); ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory, this.bootstrapContext, List.of(contributor), this.conversionService, ConfigDataEnvironmentUpdateListener.NONE); @@ -155,8 +155,8 @@ class ConfigDataEnvironmentContributorsTests { new ConfigData(List.of(secondPropertySource))); given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(secondLocations))) .willReturn(secondImported); - ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1, - this.conversionService); + ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor + .ofInitialImports(List.of(LOCATION_1), this.conversionService); ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory, this.bootstrapContext, List.of(contributor), this.conversionService, ConfigDataEnvironmentUpdateListener.NONE); @@ -184,8 +184,8 @@ class ConfigDataEnvironmentContributorsTests { new ConfigData(List.of(propertySource))); given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(locations))) .willReturn(imported); - ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1, - this.conversionService); + ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor + .ofInitialImports(List.of(LOCATION_1), this.conversionService); ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory, this.bootstrapContext, Arrays.asList(existingContributor, contributor), this.conversionService, ConfigDataEnvironmentUpdateListener.NONE); @@ -215,8 +215,8 @@ class ConfigDataEnvironmentContributorsTests { new ConfigData(List.of(secondPropertySource))); given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(secondLocations))) .willReturn(secondImported); - ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1, - this.conversionService); + ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor + .ofInitialImports(List.of(LOCATION_1), this.conversionService); ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory, this.bootstrapContext, List.of(contributor), this.conversionService, ConfigDataEnvironmentUpdateListener.NONE); @@ -243,8 +243,8 @@ class ConfigDataEnvironmentContributorsTests { new ConfigData(List.of(propertySource))); given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(locations))) .willReturn(imported); - ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1, - this.conversionService); + ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor + .ofInitialImports(List.of(LOCATION_1), this.conversionService); ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory, this.bootstrapContext, Arrays.asList(existingContributor, contributor), this.conversionService, ConfigDataEnvironmentUpdateListener.NONE); @@ -269,8 +269,8 @@ class ConfigDataEnvironmentContributorsTests { new ConfigData(List.of(propertySource))); given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(locations))) .willReturn(imported); - ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1, - this.conversionService); + ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor + .ofInitialImports(List.of(LOCATION_1), this.conversionService); ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory, this.bootstrapContext, Arrays.asList(existingContributor, contributor), this.conversionService, ConfigDataEnvironmentUpdateListener.NONE); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorIntegrationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorIntegrationTests.java index 586f09080a1..2eabfbf72f6 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorIntegrationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorIntegrationTests.java @@ -78,6 +78,7 @@ import static org.assertj.core.api.Assertions.assertThatNoException; * * @author Madhura Bhave * @author Phillip Webb + * @author Nan Chiu */ class ConfigDataEnvironmentPostProcessorIntegrationTests { @@ -330,6 +331,25 @@ class ConfigDataEnvironmentPostProcessorIntegrationTests { assertThat(property).isEqualTo("frommyprofilepropertiesfile"); } + @Test + @WithResource(name = "testproperties-1.properties", content = """ + my.property=fromtestproperties-1.properties + """) + @WithResource(name = "testproperties-1-myprofile.properties", content = """ + my.property=fromtestproperties-1-myprofile.properties + """) + @WithResource(name = "testproperties-2.properties", content = """ + my.property=fromtestproperties-2.properties + """) + void runWhenHasImportPropertyWithProfileSpecificFileTakesPrecedence() { + ConfigurableApplicationContext context = this.application.run( + "--spring.config.import=classpath:testproperties-1.properties,classpath:testproperties-2.properties", + "--spring.profiles.active=myprofile"); + ConfigurableEnvironment environment = context.getEnvironment(); + String property = environment.getProperty("my.property"); + assertThat(property).isEqualTo("fromtestproperties-1-myprofile.properties"); + } + @Test void runWhenHasLocalFileLoadsWithLocalFileTakingPrecedenceOverClasspath() throws Exception { File localFile = new File(new File("."), "application.properties"); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentTests.java index 0e23beec4a7..bb0b3501f68 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentTests.java @@ -144,7 +144,7 @@ class ConfigDataEnvironmentTests { .map(ConfigDataEnvironmentContributor::getImports) .map(Object::toString) .toArray(); - assertThat(imports).containsExactly("[i2]", "[i1]", "[a2]", "[a1]", "[l2]", "[l1]"); + assertThat(imports).containsExactly("[i1, i2]", "[a1, a2]", "[l1, l2]"); } @Test