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

Overview

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

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

なお、環境は以下の通りです。

  • Java 7
  • Spring 4.x

詳細

Environmentクラス

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

 1public class Environment {
 2    private String name;
 3
 4    private boolean loadTestMode;
 5    private boolean encryptMode;
 6    private String hashSalt;
 7
 8    private String applicationId;
 9    private String applicationSecret;
10    private String authenticationKey;
11
12    public boolean isDevelopment() {
13        return "development".equals(name);
14    }
15    public boolean isStaging() {
16        return "staging".equals(name);
17    }
18    public boolean isProduction() {
19        return "production".equals(name);
20    }
21
22    public boolean isLoadTest() {
23        return loadTestMode;
24    }
25    :
26    :
27}

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

XML

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

ディレクトリ

 1src/main/resources
 2 |- common
 3 |    |- environment-common.xml
 4 |    :
 5 |- local
 6 |    |- environment.xml
 7 |    :
 8 |- development
 9 |    |- environment.xml
10 |    :
11

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

[Java][Spring] Spring のオレオレプロジェクト構成をチラ見せ!
SpringFrameworkのプロジェクト構成についてまとめてみました。オレオレですけれど。
atuweb 開発ブログ

environment-common.xml

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

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

 1<?xml version="1.0" encoding="UTF-8"?>
 2<beans
 3    default-autowire="byName"
 4    xmlns="http://www.springframework.org/schema/beans"
 5    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 6    xmlns:util="http://www.springframework.org/schema/util"
 7    xsi:schemaLocation="
 8        http://www.springframework.org/schema/beans
 9        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
10        http://www.springframework.org/schema/util
11        http://www.springframework.org/schema/util/spring-util-4.0.xsd
12    ">
13    <bean id="abstractServiceEnvironment" abstract="true" class="net.atuweb.example.Environment">
14    <property name="name"              value="develop" />
15    <property name="loadTestMode"      value="false" />
16    <property name="encryptMode"       value="true" />
17    <property name="hashSalt"          value="xxxxxx" />
18    <property name="applicationId"     value="xxxxxx" />
19    <property name="applicationSecret" value="xxxxxx" />
20    </bean>
21</beans>

environment.xml

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

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

 1<?xml version="1.0" encoding="UTF-8"?>
 2<beans
 3    default-autowire="byName"
 4    xmlns="http://www.springframework.org/schema/beans"
 5    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 6    xmlns:mvc="http://www.springframework.org/schema/mvc"
 7    xmlns:util="http://www.springframework.org/schema/util"
 8    xsi:schemaLocation="
 9        http://www.springframework.org/schema/beans
10        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
11        http://www.springframework.org/schema/util
12        http://www.springframework.org/schema/util/spring-util-4.0.xsd
13        http://www.springframework.org/schema/mvc
14        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
15    ">
16    <import resource="classpath:/environment-common.xml" />
17    <bean id="serviceEnvironment" parent="abstractServiceEnvironment">
18        <property name="name"              value="develop" />
19        <property name="loadTestMode"      value="false" />
20        <property name="hashSalt"          value="xxxxxx" />
21        <property name="applicationId"     value="xxxxxx" />
22        <property name="applicationSecret" value="xxxxxx" />
23    </bean>
24</beans>

spring.xml

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

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

pom.xml

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

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

 1<profiles>
 2    <profile>
 3        <id>local</id>
 4        <activation>
 5            <activeByDefault>true</activeByDefault>
 6        </activation>
 7        <build>
 8            <resources>
 9                <resource>
10                    <directory>src/main/resources/common</directory>
11                </resource>
12                <resource>
13                    <directory>src/main/resources/local</directory>
14                    <filtering>true</filtering>
15                </resource>
16            </resources>
17            <plugins>
18                <plugin>
19                    <groupId>org.codehaus.mojo</groupId>
20                    <artifactId>build-helper-maven-plugin</artifactId>
21                    <version>1.8</version>
22                </plugin>
23            </plugins>
24        </build>
25    </profile>
26    <profile>
27        <id>development</id>
28        <build>
29            <resources>
30                <resource>
31                    <directory>src/main/resources/common</directory>
32                    <filtering>true</filtering>
33                </resource>
34                <resource>
35                    <directory>src/main/resources/development</directory>
36                </resource>
37            </resources>
38            <plugins>
39                :
40            </plugins>
41        </build>
42    </profile>

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

呼び出し方

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

1@Service
2public class FooService {
3    @Autowired
4    private Environment environment;
5    :

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

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

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

[Java][Spring]Propertiesクラスの使い方
SpringFrameworkでPropertiesクラスの使い方を勉強してみました。
atuweb 開発ブログ

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


SpringBootプログラミング入門

掌田 津耶乃
出版社:秀和システム  発売日:2016-02-18

Amazonで詳細を見る

SpringFramework4プログラミング入門

掌田 津耶乃
出版社:秀和システム  発売日:2014-07-30

Amazonで詳細を見る

Spring Boot Cookbook

Alex Antonov
出版社:Packt Publishing  発売日:2015-09-28

Amazonで詳細を見る