Spring @PropertySource example

来源:互联网 发布:神武2mac版 编辑:程序博客网 时间:2024/05/05 16:35
spring-properties-example

In Spring, you can use @PropertySource annotation to externalize your configuration to a properties file. In this tutorial, we will show you how to use @PropertySource to read a properties file and display the values with @Value andEnvironment.

P.S @PropertySource has been available since Spring 3.1

1. @PropertySource and @Value

A classic example, read a properties file and display with ${}.

config.properties
Bash
mongodb.url=1.2.3.4mongodb.db=hello
AppConfigMongoDB
Java
package com.mkyong.config;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;//...@Configuration@ComponentScan(basePackages = { "com.mkyong.*" })@PropertySource("classpath:config.properties")public class AppConfigMongoDB {//1.2.3.4@Value("${mongodb.url}")private String mongodbUrl;//hello@Value("${mongodb.db}")private String defaultDb;@Beanpublic MongoTemplate mongoTemplate() throws Exception {MongoClientOptions mongoOptions = new MongoClientOptions.Builder().maxWaitTime(1000 * 60 * 5).build();MongoClient mongo = new MongoClient(mongodbUrl, mongoOptions);MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongo, defaultDb);return new MongoTemplate(mongoDbFactory);}//To resolve ${} in @Value@Beanpublic static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {return new PropertySourcesPlaceholderConfigurer();}}
Note
To resolve ${} in @Values, you must register a static PropertySourcesPlaceholderConfigurer in either XML or annotation configuration file.

2. @PropertySource and Environment

Spring recommends to use Environment to get the property values.

AppConfigMongoDB
Java
package com.mkyong.config;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import org.springframework.core.env.Environment;//...@Configuration@ComponentScan(basePackages = { "com.mkyong.*" })@PropertySource("classpath:config.properties")public class AppConfigMongoDB {@Autowiredprivate Environment env;@Beanpublic MongoTemplate mongoTemplate() throws Exception {String mongodbUrl = env.getProperty("mongodb.url");String defaultDb = env.getProperty("mongodb.db");MongoClientOptions mongoOptions = new MongoClientOptions.Builder().maxWaitTime(1000 * 60 * 5).build();MongoClient mongo = new MongoClient(mongodbUrl, mongoOptions);MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongo, defaultDb);return new MongoTemplate(mongoDbFactory);}}

3. More @PropertySource Examples

More common examples.

3.1 Example to resolve ${} within @PropertySource resource locations.

Java
@Configuration@PropertySource("file:${app.home}/app.properties")public class AppConfig {@AutowiredEnvironment env;}

Set a system property during startup.

Java
System.setProperty("app.home", "test");java -jar -Dapp.home="/home/mkyon/test" example.jar

3.2 Include multiple properties files.

Java
@Configuration@PropertySource({"classpath:config.properties","classpath:db.properties" //if same key, this will 'win'})public class AppConfig {@AutowiredEnvironment env;}
Note
If a property key is duplicated, the last declared file will ‘win’ and override.

4. Spring 4 and @PropertySources

Some enhancements on Spring 4.

4.1 Introduces new @PropertySources to support Java 8 and better way to include multiple properties files.

Java
@Configuration@PropertySources({@PropertySource("classpath:config.properties"),@PropertySource("classpath:db.properties")})public class AppConfig {//...}

4.2 Allow @PropertySource to ignore the not found properties file.

Java
@Configuration@PropertySource("classpath:missing.properties")public class AppConfig {//...}

If missing.properties is not found, the system is unable to start and throws FileNotFoundException

Bash
Caused by: java.io.FileNotFoundException: class path resource [missiong.properties] cannot be opened because it does not exist

In Spring 4, you can use ignoreResourceNotFound to ignore the not found properties file

Java
@Configuration@PropertySource(value="classpath:missing.properties", ignoreResourceNotFound=true)public class AppConfig {//...}
Java
        @PropertySources({@PropertySource(value = "classpath:missing.properties", ignoreResourceNotFound=true),@PropertySource("classpath:config.properties")        })

Done.

References

  1. Sprong IO – PropertySource
  2. Spring IO – PropertySources
  3. Spring IO – Configuration
  4. Spring @Value default value
  5. Spring JIRA : SPR-8539
0 0
原创粉丝点击