cypher256's blog

Pleiades とか作った

環境プロパティー

通常、業務システムを開発する場合、色々な設定値をどこかに格納しておく必要があります。DB だったり、プロパティー・ファイルだったりするのですが、今回のシステムではプロパティー・ファイルを使いました。そこで、環境による違いを吸収するために、勝手に切り替わる仕組みを作るか、原始的な方法では手で書き換えるなどがありますが、S2 には Ruby の実行モードのような環境名というものがあります。条件により dicon ファイルの差し替えが可能だったりしますが、環境ごとのプロパティーなどは設定が同じファイル内の近くにあるほうが見やすいので、こんな感じにしました。

[/src/main/resources/env.properties]
# 一時作業ルート・パス
TEMP_ROOT_PATH.ct=c:/temp
TEMP_ROOT_PATH.it=/tmp
TEMP_ROOT_PATH.product=/tmp

# ほげルート・パス
HOGE_ROOT_PATH.ct=c:/temp
HOGE_ROOT_PATH.it=/usr/hoge
HOGE_ROOT_PATH.product=/usr/hoge

プロパティー・ファイルのキー末尾に環境名をつけておきます。

// 環境プロパティー
public class EnvProperties {
    /** 一時作業ルート・パス */
    public static String TEMP_ROOT_PATH;
    /** ほげルート・パス */
    public static String HOGE_ROOT_PATH;
}

上記クラスの対応するフィールドに環境によって適切な値が格納されます。これを格納するのは下記の環境プロパティー・ローダーです。フィールドに格納しているので、getString(<キー>) とか冗長なことをする必要はありません。フィールドが final じゃないのはあれですけど。

// 環境プロパティー・ローダー
public class EnvPropertiesLoader {
    @InitMethod
    public void init() {
        ResourceBundle bundle = ResourceBundle.getBundle("env");
        String envValue = Env.getValue();
        for (Field field : EnvProperties.class.getFields()) {
            String name = field.getName();
            String value = bundle.getString(name + "." + envValue);
            FieldUtil.set(field, null, value);
        }
    }
}
<!-- 環境プロパティー・ローダー -->
<component class="hoge.framework.internal.EnvPropertiesLoader"/>

更に EnvProperties クラスにフィールドを作るのが面倒なのと、手で作ると間違いの元なので、こんな Excel ファイルを作って EnvProperties クラスも env.properties もマクロで自動生成するようにしました。

プロパティー 結合テスト 統合テスト 本番
TEMP_ROOT_PATH c:/temp /tmp /tmp
HOGE_ROOT_PATH c:/temp /usr/hoge /usr/hoge


なぜ、コンストラクタ・インジェクションじゃなく、@InitMethod にしたかは忘れてしまいました。再ロードかな。。。 ちなみ最初のエントリーの JSTLConstantsRegister によりこの値は JSP からも普通にアクセスすることができます。