Skip to content

Commit 5317d8a

Browse files
committed
Change scope of bootstrap registered Binder
Update `ConfigDataEnvironment` so that the `Binder` is registered as a prototype bootstrap instance. This allows it to be accessed early but still replaced when a more complete version is available. Fixes gh-24559
1 parent e1b158e commit 5317d8a

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@
2222
import java.util.LinkedHashSet;
2323
import java.util.List;
2424
import java.util.Set;
25+
import java.util.function.Supplier;
2526

2627
import org.apache.commons.logging.Log;
2728

2829
import org.springframework.boot.BootstrapRegistry.InstanceSupplier;
30+
import org.springframework.boot.BootstrapRegistry.Scope;
2931
import org.springframework.boot.ConfigurableBootstrapContext;
3032
import org.springframework.boot.DefaultPropertiesPropertySource;
3133
import org.springframework.boot.context.config.ConfigDataEnvironmentContributors.BinderOption;
@@ -220,18 +222,21 @@ private ConfigDataEnvironmentContributor createInitialImportContributor(ConfigDa
220222
void processAndApply() {
221223
ConfigDataImporter importer = new ConfigDataImporter(this.logFactory, this.notFoundAction, this.resolvers,
222224
this.loaders);
223-
this.bootstrapContext.register(Binder.class, InstanceSupplier
224-
.from(() -> this.contributors.getBinder(null, BinderOption.FAIL_ON_BIND_TO_INACTIVE_SOURCE)));
225+
registerBootstrapBinder(() -> this.contributors.getBinder(null, BinderOption.FAIL_ON_BIND_TO_INACTIVE_SOURCE));
225226
ConfigDataEnvironmentContributors contributors = processInitial(this.contributors, importer);
226227
Binder initialBinder = contributors.getBinder(null, BinderOption.FAIL_ON_BIND_TO_INACTIVE_SOURCE);
227-
this.bootstrapContext.register(Binder.class, InstanceSupplier.of(initialBinder));
228+
registerBootstrapBinder(() -> initialBinder);
228229
ConfigDataActivationContext activationContext = createActivationContext(initialBinder);
229230
contributors = processWithoutProfiles(contributors, importer, activationContext);
230231
activationContext = withProfiles(contributors, activationContext);
231232
contributors = processWithProfiles(contributors, importer, activationContext);
232233
applyToEnvironment(contributors, activationContext);
233234
}
234235

236+
private void registerBootstrapBinder(Supplier<Binder> supplier) {
237+
this.bootstrapContext.register(Binder.class, InstanceSupplier.from(supplier).withScope(Scope.PROTOTYPE));
238+
}
239+
235240
private ConfigDataEnvironmentContributors processInitial(ConfigDataEnvironmentContributors contributors,
236241
ConfigDataImporter importer) {
237242
this.logger.trace("Processing initial config data environment contributors without activation context");

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ static class LocationResolver implements ConfigDataLocationResolver<Resource> {
4141

4242
@Override
4343
public boolean isResolvable(ConfigDataLocationResolverContext context, ConfigDataLocation location) {
44+
context.getBootstrapContext().get(Binder.class); // gh-24559
4445
return location.hasPrefix("testbootstrap:");
4546
}
4647

0 commit comments

Comments
 (0)