diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/context/ConfigurationPropertySourcesPlaceholderConfigurer.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/context/ConfigurationPropertySourcesPlaceholderConfigurer.java new file mode 100644 index 000000000000..23541a101344 --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/context/ConfigurationPropertySourcesPlaceholderConfigurer.java @@ -0,0 +1,37 @@ +/* + * Copyright 2012-2023 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.context; + +import org.springframework.boot.context.properties.source.ConfigurationPropertySources; +import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; +import org.springframework.core.env.ConfigurablePropertyResolver; +import org.springframework.core.env.MutablePropertySources; + +/** + * Placeholder configurer that resolves using the optimized + * {@link ConfigurablePropertyResolver}. + * + * @author Guirong Hu + */ +class ConfigurationPropertySourcesPlaceholderConfigurer extends PropertySourcesPlaceholderConfigurer { + + @Override + protected ConfigurablePropertyResolver createPropertyResolver(MutablePropertySources propertySources) { + return ConfigurationPropertySources.createPropertyResolver(propertySources); + } + +} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/context/PropertyPlaceholderAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/context/PropertyPlaceholderAutoConfiguration.java index fc59fa5a92d6..c75687217d8a 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/context/PropertyPlaceholderAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/context/PropertyPlaceholderAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 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. @@ -40,7 +40,7 @@ public class PropertyPlaceholderAutoConfiguration { @Bean @ConditionalOnMissingBean(search = SearchStrategy.CURRENT) public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { - return new PropertySourcesPlaceholderConfigurer(); + return new ConfigurationPropertySourcesPlaceholderConfigurer(); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/context/ConfigurationPropertySourcesPlaceholderConfigurerTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/context/ConfigurationPropertySourcesPlaceholderConfigurerTests.java new file mode 100644 index 000000000000..78439b0f0e8d --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/context/ConfigurationPropertySourcesPlaceholderConfigurerTests.java @@ -0,0 +1,76 @@ +/* + * Copyright 2012-2023 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.context; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.boot.context.properties.source.ConfigurationPropertySources; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.ConfigurablePropertyResolver; +import org.springframework.core.env.MutablePropertySources; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link ConfigurationPropertySourcesPlaceholderConfigurer}. + * + * @author Guirong Hu + */ +class ConfigurationPropertySourcesPlaceholderConfigurerTests { + + @Test + void propertyResolverIsOptimizedForPropertyPlaceholder() { + ConfigurablePropertyResolver expected = ConfigurationPropertySources + .createPropertyResolver(new MutablePropertySources()); + + new ApplicationContextRunner().withUserConfiguration(GetPropertyResolverPlaceholderConfigurerConfig.class) + .run((context) -> assertThat( + context.getBean(GetPropertyResolverPlaceholderConfigurer.class).getPropertyResolver()) + .hasSameClassAs(expected)); + } + + @Configuration(proxyBeanMethods = false) + static class GetPropertyResolverPlaceholderConfigurerConfig { + + @Bean + static GetPropertyResolverPlaceholderConfigurer getPropertyResolverPlaceholderConfigurer() { + return new GetPropertyResolverPlaceholderConfigurer(); + } + + } + + static class GetPropertyResolverPlaceholderConfigurer extends ConfigurationPropertySourcesPlaceholderConfigurer { + + private ConfigurablePropertyResolver propertyResolver; + + @Override + protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, + ConfigurablePropertyResolver propertyResolver) throws BeansException { + this.propertyResolver = propertyResolver; + super.processProperties(beanFactoryToProcess, propertyResolver); + } + + public ConfigurablePropertyResolver getPropertyResolver() { + return this.propertyResolver; + } + + } + +} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/context/PropertyPlaceholderAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/context/PropertyPlaceholderAutoConfigurationTests.java index a8a7122f48f6..d458d3f9b1d9 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/context/PropertyPlaceholderAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/context/PropertyPlaceholderAutoConfigurationTests.java @@ -118,7 +118,7 @@ static class PlaceholdersOverride { @Bean static PropertySourcesPlaceholderConfigurer morePlaceholders() { - PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer(); + PropertySourcesPlaceholderConfigurer configurer = new ConfigurationPropertySourcesPlaceholderConfigurer(); configurer .setProperties(StringUtils.splitArrayElementsIntoProperties(new String[] { "fruit=orange" }, "=")); configurer.setLocalOverride(true); diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystemProperties.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystemProperties.java index 17b2e1a3aec9..123ee93224d8 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystemProperties.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystemProperties.java @@ -21,11 +21,12 @@ import java.util.function.BiConsumer; import java.util.function.Function; +import org.springframework.boot.context.properties.source.ConfigurationPropertySources; import org.springframework.boot.system.ApplicationPid; import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.ConfigurablePropertyResolver; import org.springframework.core.env.Environment; import org.springframework.core.env.PropertyResolver; -import org.springframework.core.env.PropertySourcesPropertyResolver; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -217,8 +218,8 @@ public final void apply(LogFile logFile) { private PropertyResolver getPropertyResolver() { if (this.environment instanceof ConfigurableEnvironment configurableEnvironment) { - PropertySourcesPropertyResolver resolver = new PropertySourcesPropertyResolver( - configurableEnvironment.getPropertySources()); + ConfigurablePropertyResolver resolver = ConfigurationPropertySources + .createPropertyResolver(configurableEnvironment.getPropertySources()); resolver.setConversionService(((ConfigurableEnvironment) this.environment).getConversionService()); resolver.setIgnoreUnresolvableNestedPlaceholders(true); return resolver;