Spring の設定ファイル applicationContext.xml の内容をプロパティファイルに切り出す

公開日: : 最終更新日:2014/01/26 SpringFramework ,

Spring の設定ファイルである applicationContext.xml に DataSource の設定を記述しているのですが、本番環境用や、テスト環境用、それからローカル環境用にいちいち設定を変更していることに耐えられなくなりました。
簡単にプロパティファイルに切り出すことができるのでメモしておきます。

icatch-java

目次

1. 動作環境

本編の内容と動作確認はあまり関係ないと思いますが念のため。

$ java -version
java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

Spring のバージョンは次の通りです。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>3.0.5.RELEASE</version>
</dependency>

2. 切り出し方法

DataSource の設定をプロパティファイルに切り出す例とします。

2-1. プロパティファイル

プロパティファイルは app.properties の名前で、次の内容を保存してあるとします。

jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/hoge
jdbc.username = USERNAME
jdbc.password = PASSWORD

2-2. applicationContext.xml

Spring の設定ファイル applicationContext.xml は次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="  
           http://www.springframework.org/schema/beans classpath:/org/springframework/beans/factory/xml/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context classpath:/org/springframework/context/config/spring-context-3.0.xsd">

    <!-- app.properties の内容を参照するための設定 -->
    <bean id="appProps" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="ignoreResourceNotFound"><value>true</value></property>
        <property name="locations">
            <list>
                <value>classpath:app.properties</value>
            </list>
        </property>
    </bean>
    <context:property-placeholder properties-ref="appProps" />

    <!-- データソース -->
    <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    ...

</beans>

"appProps" の部分は他の書き方でもプロパティファイルを参照できるようですが、この書き方でも OK です。

DataSource の部分はプロパティファイルに定義した Key をそのまま書きます。これだけで、app.properties を読み込んで、そこに定義されている値を参照してくれるようになります。

3. プロパティファイルの切り替え

これだけだと、app.properties にデータベースの接続情報を逃しただけです。
環境別に手動で設定内容を変更することは変わっていません。

もっと良い方法があると思いますが、とりあえずこんな方法で解決したよという例をメモしておきます。


どうやって解決したかというと、環境ごとにプロパティファイルを作成しただけです。
例えば、環境ごとに次のようなファイル名でプロパティファイルを作成しました。

  • 本番環境用: app.properties.production
  • テスト環境用: app.properties.test
  • ローカル環境用: app.properties.local

そして pom.xml には次のように定義しておきます。

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
        <execution>
            <phase>validate</phase>
            <configuration>
                <tasks>
                    <!-- app.properties -->
                    <copy file="src/main/resources/app.properties.production" tofile="src/main/resources/app.properties" overwrite="true" failonerror="false" />
                    <copy file="src/main/resources/app.properties.test" tofile="src/main/resources/app.properties" overwrite="true" failonerror="false" />
                    <copy file="src/main/resources/app.properties.local" tofile="src/main/resources/app.properties" overwrite="true" failonerror="false" />
                </tasks>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

“mvn validate” を実行するとこのタスクも実行されます。

それぞれのプロパティファイルがあれば、app.properties へコピーされるようになっています。
優先度は次の通りです。

  1. ローカル環境用
  2. テスト環境用
  3. 本番環境用

app.properties.local が最後にコピーされるので、このまま “mvn validate” すればローカル環境用の設定になるというわけです。

本番環境用の設定にしたい場合は、 app.properties.test, app.properties.local をどこかに退避して “mvn validate” を実行します。
ファイルの退避を手動でやるのは面倒なので、そこはスクリプトにやらせています。

4. まとめ

環境設定を外部ファイルに逃して設定切替を自動化するってのは、プロジェクトの最初のほうでやっておくべきタスクだと思いますが、忙しさを理由に先延ばしにしてしまいました。

こういう部分で作業効率が変わってくるのでなにかいい方法があればメモしていきたいなぁと思っています。

5. その他の Spring に関する記事

Spring に関する記事は次の通りです。
気になる記事があったらぜひチェックしてみてください!

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

icatch-cron_5578829409

Spring の Scheduled アノテーションを使った cron サンプル

Spring の @Scheduled アノテーションを使った cron サンプルプログラムを作成し

記事を読む

icatch-dbcp-219581864

Spring の DataSource に DBCP を使用する

Spring の DataSource に DBCP を設定してみたのでメモしておきます。 目

記事を読む

icatch-mysql_5578829409

MySQL の JDBC ドライバで設定しておきたい rewriteBatchedStatements プロパティ

データベースに MySQL を使った Java アプリのバッチ更新処理について非常に勉強になることが

記事を読む

icatch-spring

spring framework を使ったデスクトップアプリ(standalone app)で context から getBean でオブジェクトを取得する

Java では珍しく Web ではなくデスクトップアプリの開発があり、そのプロジェクトで Sprin

記事を読む

Financial injection

spring framework を使ったデスクトップアプリ(standalone app)で context から getBean でオブジェクトを取得する。@Autowired による紐付け

先日 spring framework を使ったデスクトップアプリ(standalone app)で

記事を読む

icatch-log_5578829409

SpringJDBC が発行する SQL をログに出力する

SpringJDBC が発行する SQL を確認する必要があったので Apache log4j 1.

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


5 × = 四十

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑