Skip to content

Commit 646db44

Browse files
committed
Polish 'Fix inconsistent ordering of config imports'
See gh-49324
1 parent 1ea07ee commit 646db44

5 files changed

Lines changed: 34 additions & 82 deletions

File tree

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironment.java

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.springframework.boot.context.config;
1818

1919
import java.util.ArrayList;
20-
import java.util.Arrays;
2120
import java.util.Collection;
2221
import java.util.Collections;
2322
import java.util.LinkedHashSet;
@@ -199,8 +198,7 @@ ConfigDataEnvironmentContributors getContributors() {
199198

200199
private List<ConfigDataEnvironmentContributor> getInitialImportContributors(Binder binder) {
201200
List<ConfigDataEnvironmentContributor> initialContributors = new ArrayList<>();
202-
addInitialImportPropertyContributors(initialContributors,
203-
bindLocations(binder, IMPORT_PROPERTY, EMPTY_LOCATIONS));
201+
addInitialImportContributors(initialContributors, bindLocations(binder, IMPORT_PROPERTY, EMPTY_LOCATIONS));
204202
addInitialImportContributors(initialContributors,
205203
bindLocations(binder, ADDITIONAL_LOCATION_PROPERTY, EMPTY_LOCATIONS));
206204
addInitialImportContributors(initialContributors,
@@ -212,27 +210,21 @@ private ConfigDataLocation[] bindLocations(Binder binder, String propertyName, C
212210
return binder.bind(propertyName, CONFIG_DATA_LOCATION_ARRAY).orElse(other);
213211
}
214212

215-
private void addInitialImportPropertyContributors(List<ConfigDataEnvironmentContributor> initialContributors,
213+
private void addInitialImportContributors(List<ConfigDataEnvironmentContributor> initialContributors,
216214
ConfigDataLocation[] locations) {
217-
List<ConfigDataEnvironmentContributor> initialPropertiesContributors = new ArrayList<>();
218-
addInitialImportContributors(initialPropertiesContributors, locations);
219-
initialContributors.add(ConfigDataEnvironmentContributor.ofInitialImportProperty(
220-
initialPropertiesContributors, this.environment.getConversionService(), Arrays.asList(locations))
221-
);
215+
addInitialImportContributors(initialContributors, List.of(locations));
222216
}
223217

224218
private void addInitialImportContributors(List<ConfigDataEnvironmentContributor> initialContributors,
225-
ConfigDataLocation[] locations) {
226-
for (int i = locations.length - 1; i >= 0; i--) {
227-
initialContributors.add(createInitialImportContributor(locations[i]));
219+
List<ConfigDataLocation> locations) {
220+
if (!locations.isEmpty()) {
221+
this.logger.trace(LogMessage.format("Adding initial config data import from locations %s", locations));
222+
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImports(locations,
223+
this.environment.getConversionService());
224+
initialContributors.add(contributor);
228225
}
229226
}
230227

231-
private ConfigDataEnvironmentContributor createInitialImportContributor(ConfigDataLocation location) {
232-
this.logger.trace(LogMessage.format("Adding initial config data import from location '%s'", location));
233-
return ConfigDataEnvironmentContributor.ofInitialImport(location, this.environment.getConversionService());
234-
}
235-
236228
/**
237229
* Process all contributions and apply any newly imported property sources to the
238230
* {@link Environment}.

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributor.java

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -393,39 +393,17 @@ static ConfigDataEnvironmentContributor of(List<ConfigDataEnvironmentContributor
393393
* Factory method to create a {@link Kind#INITIAL_IMPORT initial import} contributor.
394394
* This contributor is used to trigger initial imports of additional contributors. It
395395
* does not contribute any properties itself.
396-
* @param initialImport the initial import location (with placeholders resolved)
396+
* @param initialImports the initial import locations (with placeholders resolved)
397397
* @param conversionService the conversion service to use
398398
* @return a new {@link ConfigDataEnvironmentContributor} instance
399399
*/
400-
static ConfigDataEnvironmentContributor ofInitialImport(ConfigDataLocation initialImport,
400+
static ConfigDataEnvironmentContributor ofInitialImports(List<ConfigDataLocation> initialImports,
401401
ConversionService conversionService) {
402-
List<ConfigDataLocation> imports = Collections.singletonList(initialImport);
403-
ConfigDataProperties properties = new ConfigDataProperties(imports, null);
402+
ConfigDataProperties properties = new ConfigDataProperties(initialImports, null);
404403
return new ConfigDataEnvironmentContributor(Kind.INITIAL_IMPORT, null, null, false, null, null, properties,
405404
null, null, conversionService);
406405
}
407406

408-
/**
409-
* Factory method to create a {@link Kind#INITIAL_IMPORT_PROPERTY initial import property}
410-
* contributor. This contributor is a container that wraps initial imports from
411-
* {@code spring.config.import} property, allowing profile-specific imports to take
412-
* precedence over the imported locations.
413-
* @param contributors the contributors created from the import locations
414-
* @param conversionService the conversion service to use
415-
* @param locations the original import locations from the property
416-
* @return a new {@link ConfigDataEnvironmentContributor} instance
417-
*/
418-
static ConfigDataEnvironmentContributor ofInitialImportProperty(
419-
List<ConfigDataEnvironmentContributor> contributors,
420-
ConversionService conversionService,
421-
List<ConfigDataLocation> locations) {
422-
Map<ImportPhase, List<ConfigDataEnvironmentContributor>> children = new LinkedHashMap<>();
423-
ConfigDataProperties properties = new ConfigDataProperties(locations, null);
424-
children.put(ImportPhase.BEFORE_PROFILE_ACTIVATION, Collections.unmodifiableList(contributors));
425-
return new ConfigDataEnvironmentContributor(Kind.INITIAL_IMPORT_PROPERTY, null, null, false, null, null, properties, null, children,
426-
conversionService);
427-
}
428-
429407
/**
430408
* Factory method to create a contributor that wraps an {@link Kind#EXISTING existing}
431409
* property source. The contributor provides access to existing properties, but
@@ -499,11 +477,6 @@ enum Kind {
499477
*/
500478
INITIAL_IMPORT,
501479

502-
/**
503-
* A container contributor that wraps initial imports from spring.config.import property.
504-
*/
505-
INITIAL_IMPORT_PROPERTY,
506-
507480
/**
508481
* An existing property source that contributes properties but no imports.
509482
*/

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorTests.java

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -50,21 +50,23 @@ class ConfigDataEnvironmentContributorTests {
5050

5151
private static final ConfigDataLocation TEST_LOCATION = ConfigDataLocation.of("test");
5252

53+
private static final List<ConfigDataLocation> TEST_LOCATIONS = List.of(TEST_LOCATION);
54+
5355
private final ConfigDataActivationContext activationContext = new ConfigDataActivationContext(
5456
CloudPlatform.KUBERNETES, null);
5557

5658
private final ConversionService conversionService = DefaultConversionService.getSharedInstance();
5759

5860
@Test
5961
void getKindReturnsKind() {
60-
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(TEST_LOCATION,
62+
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImports(TEST_LOCATIONS,
6163
this.conversionService);
6264
assertThat(contributor.getKind()).isEqualTo(Kind.INITIAL_IMPORT);
6365
}
6466

6567
@Test
6668
void isActiveWhenPropertiesIsNullReturnsTrue() {
67-
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(TEST_LOCATION,
69+
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImports(TEST_LOCATIONS,
6870
this.conversionService);
6971
assertThat(contributor.isActive(null)).isTrue();
7072
}
@@ -287,33 +289,18 @@ void ofCreatesRootContributor() {
287289
}
288290

289291
@Test
290-
void ofInitialImportCreatedInitialImportContributor() {
291-
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(TEST_LOCATION,
292+
void ofInitialImportsCreatedInitialImportContributor() {
293+
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImports(TEST_LOCATIONS,
292294
this.conversionService);
293295
assertThat(contributor.getKind()).isEqualTo(Kind.INITIAL_IMPORT);
294296
assertThat(contributor.getResource()).isNull();
295-
assertThat(contributor.getImports()).containsExactly(TEST_LOCATION);
297+
assertThat(contributor.getImports()).isEqualTo(TEST_LOCATIONS);
296298
assertThat(contributor.isActive(this.activationContext)).isTrue();
297299
assertThat(contributor.getPropertySource()).isNull();
298300
assertThat(contributor.getConfigurationPropertySource()).isNull();
299301
assertThat(contributor.getChildren(ImportPhase.BEFORE_PROFILE_ACTIVATION)).isEmpty();
300302
}
301303

302-
@Test
303-
void ofInitialImportPropertyCreatedInitialImportPropertyContributor() {
304-
ConfigDataEnvironmentContributor innerContributor = ConfigDataEnvironmentContributor.ofInitialImport(TEST_LOCATION,
305-
this.conversionService);
306-
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImportProperty(
307-
Collections.singletonList(innerContributor), this.conversionService, Arrays.asList(TEST_LOCATION));
308-
assertThat(contributor.getKind()).isEqualTo(Kind.INITIAL_IMPORT_PROPERTY);
309-
assertThat(contributor.getResource()).isNull();
310-
assertThat(contributor.getImports()).containsExactly(TEST_LOCATION);
311-
assertThat(contributor.isActive(this.activationContext)).isTrue();
312-
assertThat(contributor.getPropertySource()).isNull();
313-
assertThat(contributor.getConfigurationPropertySource()).isNull();
314-
assertThat(contributor.getChildren(ImportPhase.BEFORE_PROFILE_ACTIVATION)).containsExactly(innerContributor);
315-
}
316-
317304
@Test
318305
void ofExistingCreatesExistingContributor() {
319306
MockPropertySource propertySource = new MockPropertySource();

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentContributorsTests.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,8 @@ binder, new DefaultResourceLoader(getClass().getClassLoader()),
9191

9292
@Test
9393
void createCreatesWithInitialContributors() {
94-
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
95-
this.conversionService);
94+
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor
95+
.ofInitialImports(List.of(LOCATION_1), this.conversionService);
9696
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
9797
this.bootstrapContext, List.of(contributor), this.conversionService,
9898
ConfigDataEnvironmentUpdateListener.NONE);
@@ -123,8 +123,8 @@ void withProcessedImportsResolvesAndLoads() {
123123
new ConfigData(List.of(propertySource)));
124124
given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(locations)))
125125
.willReturn(imported);
126-
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
127-
this.conversionService);
126+
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor
127+
.ofInitialImports(List.of(LOCATION_1), this.conversionService);
128128
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
129129
this.bootstrapContext, List.of(contributor), this.conversionService,
130130
ConfigDataEnvironmentUpdateListener.NONE);
@@ -155,8 +155,8 @@ void withProcessedImportsResolvesAndLoadsChainedImports() {
155155
new ConfigData(List.of(secondPropertySource)));
156156
given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(secondLocations)))
157157
.willReturn(secondImported);
158-
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
159-
this.conversionService);
158+
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor
159+
.ofInitialImports(List.of(LOCATION_1), this.conversionService);
160160
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
161161
this.bootstrapContext, List.of(contributor), this.conversionService,
162162
ConfigDataEnvironmentUpdateListener.NONE);
@@ -184,8 +184,8 @@ void withProcessedImportsProvidesLocationResolverContextWithAccessToBinder() {
184184
new ConfigData(List.of(propertySource)));
185185
given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(locations)))
186186
.willReturn(imported);
187-
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
188-
this.conversionService);
187+
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor
188+
.ofInitialImports(List.of(LOCATION_1), this.conversionService);
189189
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
190190
this.bootstrapContext, Arrays.asList(existingContributor, contributor), this.conversionService,
191191
ConfigDataEnvironmentUpdateListener.NONE);
@@ -215,8 +215,8 @@ void withProcessedImportsProvidesLocationResolverContextWithAccessToParent() {
215215
new ConfigData(List.of(secondPropertySource)));
216216
given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(secondLocations)))
217217
.willReturn(secondImported);
218-
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
219-
this.conversionService);
218+
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor
219+
.ofInitialImports(List.of(LOCATION_1), this.conversionService);
220220
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
221221
this.bootstrapContext, List.of(contributor), this.conversionService,
222222
ConfigDataEnvironmentUpdateListener.NONE);
@@ -243,8 +243,8 @@ void withProcessedImportsProvidesLocationResolverContextWithAccessToBootstrapReg
243243
new ConfigData(List.of(propertySource)));
244244
given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(locations)))
245245
.willReturn(imported);
246-
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
247-
this.conversionService);
246+
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor
247+
.ofInitialImports(List.of(LOCATION_1), this.conversionService);
248248
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
249249
this.bootstrapContext, Arrays.asList(existingContributor, contributor), this.conversionService,
250250
ConfigDataEnvironmentUpdateListener.NONE);
@@ -269,8 +269,8 @@ void withProcessedImportsProvidesLoaderContextWithAccessToBootstrapRegistry() {
269269
new ConfigData(List.of(propertySource)));
270270
given(this.importer.resolveAndLoad(eq(this.activationContext), any(), any(), eq(locations)))
271271
.willReturn(imported);
272-
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofInitialImport(LOCATION_1,
273-
this.conversionService);
272+
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor
273+
.ofInitialImports(List.of(LOCATION_1), this.conversionService);
274274
ConfigDataEnvironmentContributors contributors = new ConfigDataEnvironmentContributors(this.logFactory,
275275
this.bootstrapContext, Arrays.asList(existingContributor, contributor), this.conversionService,
276276
ConfigDataEnvironmentUpdateListener.NONE);

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ void createCreatesInitialImportContributorsInCorrectOrder() {
144144
.map(ConfigDataEnvironmentContributor::getImports)
145145
.map(Object::toString)
146146
.toArray();
147-
assertThat(imports).containsExactly("[i2]", "[i1]", "[a2]", "[a1]", "[l2]", "[l1]");
147+
assertThat(imports).containsExactly("[i1, i2]", "[a1, a2]", "[l1, l2]");
148148
}
149149

150150
@Test

0 commit comments

Comments
 (0)