Allow customer resolver and property sources
Add factory methods to `AbstractEnvironment` that allow a custom `ConfigurablePropertyResolver` and `MutablePropertySources` instance to be used. See gh-26462
This commit is contained in:
parent
3524401bf1
commit
d4c609f2f0
|
@ -107,10 +107,9 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment {
|
|||
|
||||
private final Set<String> defaultProfiles = new LinkedHashSet<>(getReservedDefaultProfiles());
|
||||
|
||||
private final MutablePropertySources propertySources = new MutablePropertySources();
|
||||
private final MutablePropertySources propertySources;
|
||||
|
||||
private final ConfigurablePropertyResolver propertyResolver =
|
||||
new PropertySourcesPropertyResolver(this.propertySources);
|
||||
private final ConfigurablePropertyResolver propertyResolver;
|
||||
|
||||
|
||||
/**
|
||||
|
@ -121,9 +120,44 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment {
|
|||
* @see #customizePropertySources(MutablePropertySources)
|
||||
*/
|
||||
public AbstractEnvironment() {
|
||||
customizePropertySources(this.propertySources);
|
||||
this(new MutablePropertySources());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new {@code Environment} instance with a specific
|
||||
* {@link MutablePropertySources} instance, calling back to
|
||||
* {@link #customizePropertySources(MutablePropertySources)} during
|
||||
* construction to allow subclasses to contribute or manipulate
|
||||
* {@link PropertySource} instances as appropriate.
|
||||
* @see #customizePropertySources(MutablePropertySources)
|
||||
* @since 5.3.4
|
||||
*/
|
||||
protected AbstractEnvironment(MutablePropertySources propertySources) {
|
||||
this.propertySources = propertySources;
|
||||
this.propertyResolver = createPropertyResolver(propertySources);
|
||||
customizePropertySources(propertySources);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Factory method used to create the {@link ConfigurablePropertyResolver}
|
||||
* instance used by the Environment.
|
||||
* @see #getPropertyResolver()
|
||||
* @since 5.3.4
|
||||
*/
|
||||
protected ConfigurablePropertyResolver createPropertyResolver(
|
||||
MutablePropertySources propertySources) {
|
||||
return new PropertySourcesPropertyResolver(propertySources);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the {@link ConfigurablePropertyResolver} being used by the
|
||||
* {@link Environment}.
|
||||
* @see #createPropertyResolver(MutablePropertySources)
|
||||
*/
|
||||
protected final ConfigurablePropertyResolver getPropertyResolver() {
|
||||
return this.propertyResolver;
|
||||
}
|
||||
|
||||
/**
|
||||
* Customize the set of {@link PropertySource} objects to be searched by this
|
||||
|
|
|
@ -60,6 +60,14 @@ public class StandardEnvironment extends AbstractEnvironment {
|
|||
public static final String SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME = "systemProperties";
|
||||
|
||||
|
||||
public StandardEnvironment() {
|
||||
}
|
||||
|
||||
protected StandardEnvironment(MutablePropertySources propertySources) {
|
||||
super(propertySources);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Customize the set of property sources with those appropriate for any standard
|
||||
* Java environment:
|
||||
|
|
|
@ -129,6 +129,47 @@ class CustomEnvironmentTests {
|
|||
assertThat(env.getDefaultProfiles()).containsExactly(AbstractEnvironment.RESERVED_DEFAULT_PROFILE_NAME);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void withCustomMutablePropertySources() {
|
||||
class CustomMutablePropertySources extends MutablePropertySources {
|
||||
}
|
||||
MutablePropertySources propertySources = new CustomMutablePropertySources();
|
||||
ConfigurableEnvironment env = new AbstractEnvironment(propertySources) {
|
||||
};
|
||||
assertThat(env.getPropertySources()).isInstanceOf(CustomMutablePropertySources.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
void withCustomPropertyResolver() {
|
||||
class CustomPropertySourcesPropertyResolver extends PropertySourcesPropertyResolver {
|
||||
|
||||
public CustomPropertySourcesPropertyResolver(
|
||||
PropertySources propertySources) {
|
||||
super(propertySources);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProperty(String key) {
|
||||
return super.getProperty(key)+"-test";
|
||||
}
|
||||
|
||||
}
|
||||
ConfigurableEnvironment env = new AbstractEnvironment() {
|
||||
|
||||
@Override
|
||||
protected ConfigurablePropertyResolver createPropertyResolver(
|
||||
MutablePropertySources propertySources) {
|
||||
return new CustomPropertySourcesPropertyResolver(propertySources);
|
||||
}
|
||||
|
||||
};
|
||||
Map<String, Object> values = new LinkedHashMap<>();
|
||||
values.put("spring", "framework");
|
||||
PropertySource<?> propertySource = new MapPropertySource("test", values);
|
||||
env.getPropertySources().addFirst(propertySource);
|
||||
assertThat(env.getProperty("spring")).isEqualTo("framework-test");
|
||||
}
|
||||
|
||||
private Profiles defaultProfile() {
|
||||
return Profiles.of(AbstractEnvironment.RESERVED_DEFAULT_PROFILE_NAME);
|
||||
}
|
||||
|
|
|
@ -54,6 +54,14 @@ public class StandardServletEnvironment extends StandardEnvironment implements C
|
|||
public static final String JNDI_PROPERTY_SOURCE_NAME = "jndiProperties";
|
||||
|
||||
|
||||
public StandardServletEnvironment() {
|
||||
}
|
||||
|
||||
protected StandardServletEnvironment(MutablePropertySources propertySources) {
|
||||
super(propertySources);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Customize the set of property sources with those contributed by superclasses as
|
||||
* well as those appropriate for standard servlet-based environments:
|
||||
|
|
Loading…
Reference in New Issue