@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Repeatable(value=PropertySources.class) public @interface PropertySource
PropertySource
to Spring's
Environment
. To be used in
conjunction with @Configuration
classes.
Given a file app.properties
containing the key/value pair
testbean.name=myTestBean
, the following @Configuration
class
uses @PropertySource
to contribute app.properties
to the
Environment
's set of PropertySources
.
@Configuration @PropertySource("classpath:/com/myco/app.properties") public class AppConfig { @Autowired Environment env; @Bean public TestBean testBean() { TestBean testBean = new TestBean(); testBean.setName(env.getProperty("testbean.name")); return testBean; } }
Notice that the Environment
object is
@Autowired
into the
configuration class and then used when populating the TestBean
object. Given
the configuration above, a call to testBean.getName()
will return "myTestBean".
${...}
placeholders in <bean>
and @Value
annotationsIn order to resolve ${...} placeholders in <bean>
definitions or @Value
annotations using properties from a PropertySource
, you must ensure that an
appropriate embedded value resolver is registered in the BeanFactory
used by the ApplicationContext
. This happens automatically when using
<context:property-placeholder>
in XML. When using @Configuration
classes
this can be achieved by explicitly registering a PropertySourcesPlaceholderConfigurer
via a static
@Bean
method. Note, however, that explicit registration
of a PropertySourcesPlaceholderConfigurer
via a static
@Bean
method is typically only required if you need to customize configuration such as the
placeholder syntax, etc. See the "Working with externalized values" section of
@Configuration
's javadocs and "a note on
BeanFactoryPostProcessor-returning @Bean
methods" of @Bean
's
javadocs for details and examples.
@PropertySource
resource locationsAny ${...} placeholders present in a @PropertySource
resource location will be resolved against the set of property sources already
registered against the environment. For example:
@Configuration @PropertySource("classpath:/com/${my.placeholder:default/path}/app.properties") public class AppConfig { @Autowired Environment env; @Bean public TestBean testBean() { TestBean testBean = new TestBean(); testBean.setName(env.getProperty("testbean.name")); return testBean; } }
Assuming that "my.placeholder" is present in one of the property sources already
registered — for example, system properties or environment variables —
the placeholder will be resolved to the corresponding value. If not, then "default/path"
will be used as a default. Expressing a default value (delimited by colon ":") is
optional. If no default is specified and a property cannot be resolved, an IllegalArgumentException
will be thrown.
@PropertySource
In cases where a given property key exists in more than one .properties
file, the last @PropertySource
annotation processed will 'win' and override
any previous key with the same name.
For example, given two properties files a.properties
and
b.properties
, consider the following two configuration classes
that reference them with @PropertySource
annotations:
@Configuration @PropertySource("classpath:/com/myco/a.properties") public class ConfigA { } @Configuration @PropertySource("classpath:/com/myco/b.properties") public class ConfigB { }
The override ordering depends on the order in which these classes are registered with the application context.
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(ConfigA.class); ctx.register(ConfigB.class); ctx.refresh();
In the scenario above, the properties in b.properties
will override any
duplicates that exist in a.properties
, because ConfigB
was registered
last.
In certain situations, it may not be possible or practical to tightly control
property source ordering when using @PropertySource
annotations. For example,
if the @Configuration
classes above were registered via component-scanning,
the ordering is difficult to predict. In such cases — and if overriding is important
— it is recommended that the user fall back to using the programmatic
PropertySource
API. See ConfigurableEnvironment
and MutablePropertySources
javadocs for details.
NOTE: This annotation is repeatable according to Java 8 conventions.
However, all such @PropertySource
annotations need to be declared at the same
level: either directly on the configuration class or as meta-annotations on the
same custom annotation. Mixing direct annotations and meta-annotations is not
recommended since direct annotations will effectively override meta-annotations.
PropertySources
,
Configuration
,
PropertySource
,
ConfigurableEnvironment.getPropertySources()
,
MutablePropertySources
Modifier and Type | Required Element and Description |
---|---|
String[] |
value
Indicate the resource location(s) of the properties file to be loaded.
|
Modifier and Type | Optional Element and Description |
---|---|
String |
encoding
A specific character encoding for the given resources, e.g.
|
Class<? extends PropertySourceFactory> |
factory
Specify a custom
PropertySourceFactory , if any. |
boolean |
ignoreResourceNotFound
Indicate if a failure to find a
property resource should be
ignored. |
String |
name
Indicate the name of this property source.
|
public abstract String[] value
Both traditional and XML-based properties file formats are supported
— for example, "classpath:/com/myco/app.properties"
or "file:/path/to/file.xml"
.
Resource location wildcards (e.g. **/*.properties) are not permitted;
each location must evaluate to exactly one .properties
or .xml
resource.
${...} placeholders will be resolved against any/all property sources already
registered with the Environment
. See above
for examples.
Each location will be added to the enclosing Environment
as its own
property source, and in the order declared.
public abstract String name
factory()
will generate a name based on the underlying resource (in the case of
DefaultPropertySourceFactory
:
derived from the resource description through a corresponding name-less
ResourcePropertySource
constructor).public abstract boolean ignoreResourceNotFound
property resource
should be
ignored.
true
is appropriate if the properties file is completely optional.
Default is false
.
public abstract String encoding
public abstract Class<? extends PropertySourceFactory> factory
PropertySourceFactory
, if any.
By default, a default factory for standard resource files will be used.
DefaultPropertySourceFactory
,
ResourcePropertySource