この記事は1年以上編集されていないため、情報が古い可能性がございます。
ご注意ください。

このWordPress pluginを配布しています

Spring Frameworkで「環境別に設定値を切り替える」サンプルです。

Overview

BeanFactoryを利用し、SetterInjectionで環境別に設定値をDIする。

  1. Environmentクラスを用意する
  2. Environmentクラスに値を差し込むためのXMLを用意する
  3. pom.xmlで環境ごとにロードするxmlを切り替える

Environmentクラス

プロパティの保持や検証などをおこなうシンプルなクラスを用意します。

public class Environment {
    private String name;

    private boolean loadTestMode;
    private boolean encryptMode;
    private String hashSalt;

    private String applicationId;
    private String applicationSecret;
    private String authenticationKey;

    public boolean isDevelopment() {
        return "development".equals(name);
    }
    public boolean isStaging() {
        return "staging".equals(name);
    }
    public boolean isProduction() {
        return "production".equals(name);
    }

    public boolean isLoadTest() {
        return loadTestMode;
    }
    :
    :
}

実際にはlombokを利用してGetter/Setterを省略しています。

XML

次のように環境別に設定用XMLを作成します。

ディレクトリ

src/main/resources
 |- common
 |    |- environment-common.xml
 |    :
 |- local
 |    |- environment.xml
 |    :
 |- development
 |    |- environment.xml
 |    :
 :

ディレクトリ構成などの詳細は以下もぜひご覧ください。

[Java][Spring]Springのオレオレプロジェクト構成をチラ見せ!
Spring Frameworkで開発した、稼働実績があるプロジェクトの構成をご紹介いたします。 バージョンは以下の通りです。...

environment-common.xml

こちらは共通設定用の定義ファイルです。

環境依存しないアプリケーション全体の設定を行うものやデフォルト値を定義する良いでしょう。

<?xml version="1.0" encoding="UTF-8"?>
<beans
    default-autowire="byName"
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util-4.0.xsd
    ">
    <bean id="abstractServiceEnvironment" abstract="true" class="net.atuweb.example.Environment">
    <property name="name"              value="develop" />
    <property name="loadTestMode"      value="false" />
    <property name="encryptMode"       value="true" />
    <property name="hashSalt"          value="xxxxxx" />
    <property name="applicationId"     value="xxxxxx" />
    <property name="applicationSecret" value="xxxxxx" />
    </bean>
</beans>

environment.xml

こちらは環境個別の値を定義するものです。

上のenvironment-common.xmlをインポートし、abstractを具象化します。
各プロパティはこちらの定義で上書きされますよ。

<?xml version="1.0" encoding="UTF-8"?>
<beans
    default-autowire="byName"
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util-4.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
    ">
    <import resource="classpath:/environment-common.xml" />
    <bean id="serviceEnvironment" parent="abstractServiceEnvironment">
        <property name="name"              value="develop" />
        <property name="loadTestMode"      value="false" />
        <property name="hashSalt"          value="xxxxxx" />
        <property name="applicationId"     value="xxxxxx" />
        <property name="applicationSecret" value="xxxxxx" />
    </bean>
</beans>

spring.xml

springの設定ファイルなどに、上記XMLをロードする記述を追記してください。

<beans:import resource="classpath:/environment.xml" />

pom.xml

Profileにそれぞれ、リソースディレクトリを指定します。

共通、個別と、複数のリソースディレクトリをロードするためにはbuild-helper-maven-pluginを使います。

<profiles>
    <profile>
        <id>local</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources/common</directory>
                </resource>
                <resource>
                    <directory>src/main/resources/local</directory>
                    <filtering>true</filtering>
                </resource>
            </resources>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>build-helper-maven-plugin</artifactId>
                    <version>1.8</version>
                </plugin>
            </plugins>
        </build>
    </profile>
    <profile>
        <id>development</id>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources/common</directory>
                    <filtering>true</filtering>
                </resource>
                <resource>
                    <directory>src/main/resources/development</directory>
                </resource>
            </resources>
            <plugins>
                :
            </plugins>
        </build>
    </profile>

インストールやパッケージングする際にmvm -P developmentというようにプロファイルを指定してください。

呼び出し方

あとは通常通り、コントローラーやサービスクラスからDIするだけです。

@Service
public class FooService {
    @Autowired
    private Environment environment;
    :

Propertiesで簡易的に環境を定義する

これ以外にもSpringでは様々な解決方法があると思います。

その1つとして、「Profileごとにリソースディレクトリを分けてPropertiesクラスを利用する」といった方法でも環境別の定義が可能です。

[Java][Spring]Propertiesクラスの使い方
Springの便利な機能を知らず、メッセージ管理クラスで都度テキストファイルを読み込む実装をしていたため、Propertie...

ただし、こちらはできることが限られてしまいますので、簡易的なものという位置付けで考えていただければ良いと思います。


この記事はtomita@atuwebがお届けしました。


Spring Boot Cookbook

スポンサーリンク
ad_336
ad_336
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
コメントの入力は終了しました。