環境プロパティー
通常、業務システムを開発する場合、色々な設定値をどこかに格納しておく必要があります。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 からも普通にアクセスすることができます。