Spring @PropertySourceの例

spring-properties-example、width = 431、height = 223

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")
        })

完了しました。