kuniku’s diary

はてなダイアリーから移行(旧 d.hatena.ne.jp/kuniku/)、表示がおかしな箇所はコメントをお願いします。記載されている内容は日付およびバージョンに注意してください。直近1年以上前は古い情報の可能性が高くなります。

アプリケーションの初期化・設定値

ん・・・みんなどうしてるんでしょ。

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に応じた、ファイルセパレータ取得とか、必要なものをどんどん追加

}