Fix ConfigurationPropertySources attach logic
Fix `ConfigurationPropertySources.attach` so that repeated calls to the same source no longer create a new instance. Fixes gh-29409
This commit is contained in:
		
							parent
							
								
									3f7bf7d34f
								
							
						
					
					
						commit
						79d9549805
					
				|  | @ -1,5 +1,5 @@ | |||
| /* | ||||
|  * Copyright 2012-2021 the original author or authors. | ||||
|  * Copyright 2012-2022 the original author or authors. | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  | @ -87,15 +87,16 @@ public final class ConfigurationPropertySources { | |||
| 		Assert.isInstanceOf(ConfigurableEnvironment.class, environment); | ||||
| 		MutablePropertySources sources = ((ConfigurableEnvironment) environment).getPropertySources(); | ||||
| 		PropertySource<?> attached = getAttached(sources); | ||||
| 		if (attached != null && attached.getSource() != sources) { | ||||
| 			sources.remove(ATTACHED_PROPERTY_SOURCE_NAME); | ||||
| 			attached = null; | ||||
| 		if (attached != null) { | ||||
| 			if (attached instanceof ConfigurationPropertySourcesPropertySource | ||||
| 					&& ((SpringConfigurationPropertySources) attached.getSource()).isUsingSources(sources)) { | ||||
| 				return; | ||||
| 			} | ||||
| 			sources.remove(ATTACHED_PROPERTY_SOURCE_NAME); | ||||
| 		} | ||||
| 		if (attached == null) { | ||||
| 		sources.addFirst(new ConfigurationPropertySourcesPropertySource(ATTACHED_PROPERTY_SOURCE_NAME, | ||||
| 				new SpringConfigurationPropertySources(sources))); | ||||
| 	} | ||||
| 	} | ||||
| 
 | ||||
| 	static PropertySource<?> getAttached(MutablePropertySources sources) { | ||||
| 		return (sources != null) ? sources.get(ATTACHED_PROPERTY_SOURCE_NAME) : null; | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| /* | ||||
|  * Copyright 2012-2020 the original author or authors. | ||||
|  * Copyright 2012-2022 the original author or authors. | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  | @ -71,6 +71,19 @@ class ConfigurationPropertySourcesTests { | |||
| 		assertThat(child.getProperty("my.example-property")).isEqualTo("1234"); | ||||
| 	} | ||||
| 
 | ||||
| 	@Test | ||||
| 	void attachWhenAlreadyAttachedWithSameSourcesShouldReturnExistingInstance() { | ||||
| 		ConfigurableEnvironment environment = new StandardEnvironment(); | ||||
| 		MutablePropertySources sources = environment.getPropertySources(); | ||||
| 		sources.addLast(new SystemEnvironmentPropertySource("system", Collections.singletonMap("SERVER_PORT", "1234"))); | ||||
| 		sources.addLast(new MapPropertySource("config", Collections.singletonMap("server.port", "4568"))); | ||||
| 		ConfigurationPropertySources.attach(environment); | ||||
| 		Iterable<ConfigurationPropertySource> first = ConfigurationPropertySources.get(environment); | ||||
| 		ConfigurationPropertySources.attach(environment); | ||||
| 		Iterable<ConfigurationPropertySource> second = ConfigurationPropertySources.get(environment); | ||||
| 		assertThat(first).isSameAs(second); | ||||
| 	} | ||||
| 
 | ||||
| 	@Test | ||||
| 	void getWhenNotAttachedShouldReturnAdapted() { | ||||
| 		ConfigurableEnvironment environment = new StandardEnvironment(); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue