Spring @PropertySourceの例
Springでは、
@ PropertySource`アノテーションを使って設定をプロパティファイルに外部化することができます。このチュートリアルでは、 `@ PropertySource`を使ってプロパティファイルを読み込み、値を
@ Value`と `Environment`で表示する方法を説明します。
__P.S @PropertySourceはSpring 3.1以降に利用可能です。
1. @PropertySourceと@Value
古典的な例では、プロパティファイルを読み、 `$ {}`で表示します。
config.properties
mongodb.url=1.2.3.4 mongodb.db=hello
AppConfigMongoDB
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; @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(); } }
2. @PropertySourceと環境
Springは `Environment`を使用してプロパティ値を取得することを推奨しています。
AppConfigMongoDB
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 { @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. More @PropertySourceの例
より一般的な例。
3.1 `@ PropertySource`リソースの場所で$ \ {}を解決する例。
@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複数のプロパティファイルを含める。
@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 Java 8をサポートするための新しい `@ PropertySources`と、複数のプロパティファイルを組み込むためのより良い方法を紹介します。
@Configuration @PropertySources({ @PropertySource("classpath:config.properties"), @PropertySource("classpath:db.properties") }) public class AppConfig { //... }
4.2 `@ PropertySource`が見つからないプロパティファイルを無視することを許可します。
@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") })
完了しました。
参考文献
IO – PropertySource]。
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/PropertySources.html
[Spring
IO – PropertySources]。
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html
[Spring
IO – 構成]。 link://spring3/spring-value-default-value/[Spring @Value default