Allow access to applied property sources

Add PropertySourcesPlaceholderConfigurer.getAppliedPropertySources() to
allow access to the PropertySources that were actually applied.

Issue: SPR-10545
This commit is contained in:
Phillip Webb 2013-05-08 19:39:12 -07:00
parent 0652febe34
commit eb1776e79d
2 changed files with 37 additions and 10 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -31,6 +31,7 @@ import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource; import org.springframework.core.env.PropertySource;
import org.springframework.core.env.PropertySources; import org.springframework.core.env.PropertySources;
import org.springframework.core.env.PropertySourcesPropertyResolver; import org.springframework.core.env.PropertySourcesPropertyResolver;
import org.springframework.util.Assert;
import org.springframework.util.StringValueResolver; import org.springframework.util.StringValueResolver;
/** /**
@ -79,6 +80,8 @@ public class PropertySourcesPlaceholderConfigurer extends PlaceholderConfigurerS
private MutablePropertySources propertySources; private MutablePropertySources propertySources;
private PropertySources appliedPropertySources;
private Environment environment; private Environment environment;
@ -149,6 +152,7 @@ public class PropertySourcesPlaceholderConfigurer extends PlaceholderConfigurerS
} }
this.processProperties(beanFactory, new PropertySourcesPropertyResolver(this.propertySources)); this.processProperties(beanFactory, new PropertySourcesPropertyResolver(this.propertySources));
this.appliedPropertySources = this.propertySources;
} }
/** /**
@ -186,4 +190,16 @@ public class PropertySourcesPlaceholderConfigurer extends PlaceholderConfigurerS
"Call processProperties(ConfigurableListableBeanFactory, ConfigurablePropertyResolver) instead"); "Call processProperties(ConfigurableListableBeanFactory, ConfigurablePropertyResolver) instead");
} }
/**
* Returns the property sources that were actually applied during
* {@link #postProcessBeanFactory(ConfigurableListableBeanFactory) post-processing}.
* @return the property sources that were applied
* @throws IllegalStateException if the property sources have not yet been applied
* @since 4.0
*/
public PropertySources getAppliedPropertySources() throws IllegalStateException {
Assert.state(this.appliedPropertySources != null, "PropertySources have not get been applied");
return this.appliedPropertySources;
}
} }

View File

@ -16,28 +16,26 @@
package org.springframework.context.support; package org.springframework.context.support;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import static org.springframework.beans.factory.support.BeanDefinitionBuilder.genericBeanDefinition;
import static org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition;
import java.util.Properties; import java.util.Properties;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.BeanDefinitionStoreException;
import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource; import org.springframework.core.env.PropertySource;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.mock.env.MockEnvironment; import org.springframework.mock.env.MockEnvironment;
import org.springframework.mock.env.MockPropertySource; import org.springframework.mock.env.MockPropertySource;
import org.springframework.tests.sample.beans.TestBean; import org.springframework.tests.sample.beans.TestBean;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.springframework.beans.factory.support.BeanDefinitionBuilder.*;
/** /**
* Unit tests for {@link PropertySourcesPlaceholderConfigurer}. * Unit tests for {@link PropertySourcesPlaceholderConfigurer}.
* *
@ -46,6 +44,9 @@ import org.springframework.tests.sample.beans.TestBean;
*/ */
public class PropertySourcesPlaceholderConfigurerTests { public class PropertySourcesPlaceholderConfigurerTests {
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test @Test
public void replacementFromEnvironmentProperties() { public void replacementFromEnvironmentProperties() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
@ -62,6 +63,7 @@ public class PropertySourcesPlaceholderConfigurerTests {
ppc.setEnvironment(env); ppc.setEnvironment(env);
ppc.postProcessBeanFactory(bf); ppc.postProcessBeanFactory(bf);
assertThat(bf.getBean(TestBean.class).getName(), equalTo("myValue")); assertThat(bf.getBean(TestBean.class).getName(), equalTo("myValue"));
assertThat(ppc.getAppliedPropertySources(), not(nullValue()));
} }
@Test @Test
@ -104,6 +106,7 @@ public class PropertySourcesPlaceholderConfigurerTests {
pc.setPropertySources(propertySources); pc.setPropertySources(propertySources);
pc.postProcessBeanFactory(bf); pc.postProcessBeanFactory(bf);
assertThat(bf.getBean(TestBean.class).getName(), equalTo("foo")); assertThat(bf.getBean(TestBean.class).getName(), equalTo("foo"));
assertEquals(pc.getAppliedPropertySources().iterator().next(), propertySources.iterator().next());
} }
@Test @Test
@ -123,6 +126,7 @@ public class PropertySourcesPlaceholderConfigurerTests {
pc.setIgnoreUnresolvablePlaceholders(true); pc.setIgnoreUnresolvablePlaceholders(true);
pc.postProcessBeanFactory(bf); pc.postProcessBeanFactory(bf);
assertThat(bf.getBean(TestBean.class).getName(), equalTo("${my.name}")); assertThat(bf.getBean(TestBean.class).getName(), equalTo("${my.name}"));
assertEquals(pc.getAppliedPropertySources().iterator().next(), propertySources.iterator().next());
} }
@Test @Test
@ -254,4 +258,11 @@ public class PropertySourcesPlaceholderConfigurerTests {
ppc.postProcessBeanFactory(bf); ppc.postProcessBeanFactory(bf);
assertThat(bf.getBean(TestBean.class).getName(), nullValue()); assertThat(bf.getBean(TestBean.class).getName(), nullValue());
} }
@Test
public void getAppliedPropertySourcesTooEarly() throws Exception {
PropertySourcesPlaceholderConfigurer ppc = new PropertySourcesPlaceholderConfigurer();
thrown.expect(IllegalStateException.class);
ppc.getAppliedPropertySources();
}
} }