Skip to content

Commit

Permalink
Use configuration resolver to replace standard resolver
Browse files Browse the repository at this point in the history
Closes gh-28687
  • Loading branch information
terminux committed Apr 10, 2023
1 parent 12537c7 commit 15f27d2
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 7 deletions.
@@ -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);
}

}
@@ -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.
Expand Down Expand Up @@ -40,7 +40,7 @@ public class PropertyPlaceholderAutoConfiguration {
@Bean
@ConditionalOnMissingBean(search = SearchStrategy.CURRENT)
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
return new ConfigurationPropertySourcesPlaceholderConfigurer();
}

}
@@ -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;
}

}

}
Expand Up @@ -113,7 +113,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);
Expand Down
@@ -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.
Expand All @@ -20,11 +20,12 @@
import java.nio.charset.StandardCharsets;
import java.util.function.BiConsumer;

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;

/**
Expand Down Expand Up @@ -162,8 +163,8 @@ protected void apply(LogFile logFile, PropertyResolver resolver) {

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;
Expand Down

0 comments on commit 15f27d2

Please sign in to comment.