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
This commit is contained in:
parent
e1b158ec66
commit
5317d8a9bb
|
|
@ -22,10 +22,12 @@ import java.util.Collections;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
import org.springframework.boot.BootstrapRegistry.InstanceSupplier;
|
import org.springframework.boot.BootstrapRegistry.InstanceSupplier;
|
||||||
|
import org.springframework.boot.BootstrapRegistry.Scope;
|
||||||
import org.springframework.boot.ConfigurableBootstrapContext;
|
import org.springframework.boot.ConfigurableBootstrapContext;
|
||||||
import org.springframework.boot.DefaultPropertiesPropertySource;
|
import org.springframework.boot.DefaultPropertiesPropertySource;
|
||||||
import org.springframework.boot.context.config.ConfigDataEnvironmentContributors.BinderOption;
|
import org.springframework.boot.context.config.ConfigDataEnvironmentContributors.BinderOption;
|
||||||
|
|
@ -220,11 +222,10 @@ class ConfigDataEnvironment {
|
||||||
void processAndApply() {
|
void processAndApply() {
|
||||||
ConfigDataImporter importer = new ConfigDataImporter(this.logFactory, this.notFoundAction, this.resolvers,
|
ConfigDataImporter importer = new ConfigDataImporter(this.logFactory, this.notFoundAction, this.resolvers,
|
||||||
this.loaders);
|
this.loaders);
|
||||||
this.bootstrapContext.register(Binder.class, InstanceSupplier
|
registerBootstrapBinder(() -> this.contributors.getBinder(null, BinderOption.FAIL_ON_BIND_TO_INACTIVE_SOURCE));
|
||||||
.from(() -> this.contributors.getBinder(null, BinderOption.FAIL_ON_BIND_TO_INACTIVE_SOURCE)));
|
|
||||||
ConfigDataEnvironmentContributors contributors = processInitial(this.contributors, importer);
|
ConfigDataEnvironmentContributors contributors = processInitial(this.contributors, importer);
|
||||||
Binder initialBinder = contributors.getBinder(null, BinderOption.FAIL_ON_BIND_TO_INACTIVE_SOURCE);
|
Binder initialBinder = contributors.getBinder(null, BinderOption.FAIL_ON_BIND_TO_INACTIVE_SOURCE);
|
||||||
this.bootstrapContext.register(Binder.class, InstanceSupplier.of(initialBinder));
|
registerBootstrapBinder(() -> initialBinder);
|
||||||
ConfigDataActivationContext activationContext = createActivationContext(initialBinder);
|
ConfigDataActivationContext activationContext = createActivationContext(initialBinder);
|
||||||
contributors = processWithoutProfiles(contributors, importer, activationContext);
|
contributors = processWithoutProfiles(contributors, importer, activationContext);
|
||||||
activationContext = withProfiles(contributors, activationContext);
|
activationContext = withProfiles(contributors, activationContext);
|
||||||
|
|
@ -232,6 +233,10 @@ class ConfigDataEnvironment {
|
||||||
applyToEnvironment(contributors, activationContext);
|
applyToEnvironment(contributors, activationContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void registerBootstrapBinder(Supplier<Binder> supplier) {
|
||||||
|
this.bootstrapContext.register(Binder.class, InstanceSupplier.from(supplier).withScope(Scope.PROTOTYPE));
|
||||||
|
}
|
||||||
|
|
||||||
private ConfigDataEnvironmentContributors processInitial(ConfigDataEnvironmentContributors contributors,
|
private ConfigDataEnvironmentContributors processInitial(ConfigDataEnvironmentContributors contributors,
|
||||||
ConfigDataImporter importer) {
|
ConfigDataImporter importer) {
|
||||||
this.logger.trace("Processing initial config data environment contributors without activation context");
|
this.logger.trace("Processing initial config data environment contributors without activation context");
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ class TestConfigDataBootstrap {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isResolvable(ConfigDataLocationResolverContext context, ConfigDataLocation location) {
|
public boolean isResolvable(ConfigDataLocationResolverContext context, ConfigDataLocation location) {
|
||||||
|
context.getBootstrapContext().get(Binder.class); // gh-24559
|
||||||
return location.hasPrefix("testbootstrap:");
|
return location.hasPrefix("testbootstrap:");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue