Spring @PropertySourceの例
Springでは、@PropertySource
アノテーションを使用して、構成をプロパティファイルに外部化できます。 このチュートリアルでは、@PropertySource
を使用してプロパティファイルを読み取り、@Value
とEnvironment
で値を表示する方法を示します。
P.S @PropertySource has been available since Spring 3.1
1. @PropertySourceおよび@Value
古典的な例として、プロパティファイルを読み取り、${}
で表示します。
config.properties
mongodb.url=1.2.3.4 mongodb.db=hello
AppConfigMongoDB
package com.example.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.example.*" }) @PropertySource("classpath:config.properties") public class AppConfigMongoDB { //1.2.3.4 @Value("${mongodb.url}") private String mongodbUrl; //hello @Value("${mongodb.db}") private String defaultDb; @Bean public 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 @Bean public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() { return new PropertySourcesPlaceholderConfigurer(); } }
Note@Values
の$ \ {}を解決するには、XMLまたは注釈構成ファイルのいずれかに静的PropertySourcesPlaceholderConfigurer
を登録する必要があります。
2. @PropertySourceと環境
Springは、Environment
を使用してプロパティ値を取得することをお勧めします。
AppConfigMongoDB
package com.example.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.example.*" }) @PropertySource("classpath:config.properties") public class AppConfigMongoDB { @Autowired private Environment env; @Bean public 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. @PropertySourceのその他の例
より一般的な例。
3.1 Example to resolve $\{} within @PropertySource
resource locations.
@Configuration @PropertySource("file:${app.home}/app.properties") public class AppConfig { @Autowired Environment env; }
起動時にシステムプロパティを設定します。
System.setProperty("app.home", "test"); java -jar -Dapp.home="/home/mkyon/test" example.jar
3.2 Include multiple properties files.
@Configuration @PropertySource({ "classpath:config.properties", "classpath:db.properties" //if same key, this will 'win' }) public class AppConfig { @Autowired Environment env; }
注
プロパティキーが重複している場合、最後に宣言されたファイルが「勝ち」、オーバーライドされます。
4. Spring 4および@PropertySources
Spring 4のいくつかの機能強化。
4.1 Introduces new @PropertySources
to support Java 8 and better way to include multiple properties files.
@Configuration @PropertySources({ @PropertySource("classpath:config.properties"), @PropertySource("classpath:db.properties") }) public class AppConfig { //... }
4.2 Allow @PropertySource
to ignore the not found properties file.
@Configuration @PropertySource("classpath:missing.properties") public class AppConfig { //... }
missing.properties
が見つからない場合、システムは起動できず、FileNotFoundException
をスローします
Caused by: java.io.FileNotFoundException: class path resource [missiong.properties] cannot be opened because it does not exist
Spring 4では、ignoreResourceNotFound
を使用して、見つからないプロパティファイルを無視できます。
@Configuration @PropertySource(value="classpath:missing.properties", ignoreResourceNotFound=true) public class AppConfig { //... }
@PropertySources({ @PropertySource(value = "classpath:missing.properties", ignoreResourceNotFound=true), @PropertySource("classpath:config.properties") })
完了しました。