アプリケーションの初期化・設定値
- SAStrutsでアプリケーション設定値をもたせる方法
- S2 Webアプリの初期化
- アプリケーションの起動時にやりたいことをどうするか。
ん・・・みんなどうしてるんでしょ。
diconファイルに記述するというのは、柔軟かもしれません。
設定するプロパティなどもdiconバリデーションでチェックできるだろうし。
型指定やHashMapやLinkedHashMapなどなど、OGNLを強力に使えそう。
その他の方法としては、
- DBに設定情報を保持する
DBに、設定値格納用テーブルを用意しておきアプリ起動時に、それを取得しにいき。
HashMapなどで保持しておくとか。
でも、DB使うと面倒というか、手間がかかる場合がある。
設定情報を使わないといけないテストクラスでテストクラスのsetUp()メソッドで、
読み込むようにするとメソッドを実行するたびに、取得処理をしてしまうとか。
- 設定ファイル(properties)を使う
system.propertiesに
ガリガリゴリゴリ書くとか。
この場合に、設定ファイルが1ファイルだけならば、Seasarなどに関係なく
単なるUtilクラスとしてしまえば、どこからでも使える。
public class SystemProperties { /** リソースバンドル */ private static final ResourceBundle resourceBundle = ResourceBundle.getBundle("resources/system"); private SystemProperties() { } /** * 指定したプロパティの値を取得 * @param key プロパティのキー値 * @return キーに対応するプロパティ値 */ public static String getProperty(String key) { return resourceBundle.getString(key); } /** * 指定したプロパティの値リストを取得 * @param key プロパティのキー値 * @return キーに対応するプロパティ値 */ public static String[] getProperties(String key) { return resourceBundle.getString(key).split(","); } }
設定ファイルを使う場合は、
org.apache.commons.configuration.Configuration を使うと便利
このConfigurationには、
containsKey,getKeys,getString,getBoolean,getByte,getInt,getDouble,getFloat,
getShort,getBigDecimal,getLong,getStringArray
などいろいろなメソッドもあるし、設定値がない場合は、引数でデフォルト指定できたりする。
過去に、以下のような感じで実装した。
クラスパス直下に、conf.xml を用意して
その中に、
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <properties fileName="system.properties"/> <properties fileName="exception.properties"/> <properties fileName="xxxxx.properties"/> </configuration>
のように、定義してconf.xmlと同階層に設定ファイルを置く。
fileNameのパスを変えれば、置く場所は変更できる。
で、Seasarを使う前は、以下のような感じで、XMLの読み込み、設定情報の取得をしていた
Seasarを使う場合は、コンストラクタインジェクションなどでconf.xmlのファイル名を渡し
イニシャライズ用のメソッドを呼び出すなどすればできると思う。
設定情報を管理するXMLファイルを読み込み、Configurationのインスタンスを生成する
import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.ConfigurationFactory; public class ConfigurationServiceFactory { private static final ConfigurationServiceFactory instance = new ConfigurationServiceFactory(); private ConfigurationServiceFactory() { } /** * インスタンスの取得 * * @return このクラスのsingletonのインスタンス **/ public static ConfigurationServiceFactory getInstance() { return instance; } private Configuration CONFIGURATION_ = null; public Configuration create(String basePath, String confFilePath) { try { ConfigurationFactory factory = new ConfigurationFactory(); factory.setBasePath(basePath); factory.setConfigurationFileName(confFilePath); CONFIGURATION_ = factory.getConfiguration(); return CONFIGURATION_; } catch (ConfigurationException e) { System.err.println("properties読み込みエラー"); e.printStackTrace(); throw new RuntimeException(e); } } /** * ユニットテスト用? conf.xml相当をtestソースのルートに配置 */ public Configuration create4Unit(String confXMLFilePath) { try { ConfigurationFactory factory = new ConfigurationFactory(); factory.setConfigurationFileName(confXMLFilePath); CONFIGURATION_ = factory.getConfiguration(); return CONFIGURATION_; } catch (ConfigurationException e) { System.err.println("properties読み込みエラー"); e.printStackTrace(); throw new RuntimeException(e); } } }
テストクラスで設定を読み込ませてみる
public class XxxxTestCase extends TestCase { protected static void setUpConfiguration() throws Exception { System.out.println("Configurationの設定を開始します。"); final String confXMLFilePath = "conf4Unit.xml"; Configuration configuration = ConfigurationServiceFactory.getInstance().create4Unit(confXMLFilePath); ConfigurationServiceImpl c = new ConfigurationServiceImpl(configuration); System.out.println("Configurationの設定を終了します。"); String s = c.getString("Factory.JNDI"); System.out.println("Factory.JNDI=" + s); } }
org.apache.commons.configuration.Configurationで提供すべきメソッド
(org.apache.commons.configuration.Configurationで定義されているインターフェイス)と同等なインターフェイス(以下のConfigurationService )を実装するクラス
/** * ConfigurationServiceの実装クラス */ public final class ConfigurationServiceImpl implements ConfigurationService { /** * <code>CONFIGURATION_</code> Configurationのクラス変数<br> * このクラスのstatic変数またはstatic finalであること。 */ private static org.apache.commons.configuration.Configuration CONFIGURATION_ = null; private static final ConfigurationService instance = new ConfigurationServiceImpl(); private ConfigurationServiceImpl() { } public static ConfigurationService getInstance() { return instance; } public ConfigurationServiceImpl(Configuration configuration) { // 念のための同期化。アプリ起動時ならば、同期化は不要 synchronized (this) { this.CONFIGURATION_ = configuration; } } //以下、ConfigurationServiceインターフェイスで定義した実装クラスのメソッド //org.apache.commons.configuration.Configurationのインスタンスに委譲(コンポジション?)するだけ〜。 public int getInt(String key, int defaultValue) { return CONFIGURATION_.getInt(key, defaultValue); } public List getList(String key) { return CONFIGURATION_.getList(key); } public long getLong(String key) { return CONFIGURATION_.getLong(key); } public long getLong(String key, long defaultValue) { return CONFIGURATION_.getLong(key, defaultValue); } public short getShort(String key) { return CONFIGURATION_.getShort(key); } public String[] getStringArray(String key) { return CONFIGURATION_.getStringArray(key); } public String getString(String key) { return CONFIGURATION_.getString(key); } public String getString(String key, String defaultValue) { return CONFIGURATION_.getString(key, defaultValue); } }
org.apache.commons.configuration.Configuration相当のインタフェイス
/** * org.apache.commons.configuration.Configuration相当または * 同等なインターフェイス **/ public interface ConfigurationService { boolean getBoolean(String key); boolean getBoolean(String key, boolean defaultValue); byte getByte(String key); int getInt(String key); int getInt(String key, int defaultValue); long getLong(String key); long getLong(String key, long defaultValue); String getString(String key); String getString(String key, String defaultValue); String[] getStringArray(String key); List getList(String key); ・・・ いろいろと他にも OSに応じた、ファイルセパレータ取得とか、必要なものをどんどん追加 }