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