typesafe/Config ConfigBeanFactoryの良さそうな使い方

設定ファイルを扱いたくて、イマドキどんな形式が良いんだろうなと調べてみたら、 typesafe/ConfigというライブラリでHOCONというファイル形式があるらしい。

紹介記事や簡単な使い方については、以下を参照。

Java アプリケーションのための設定ファイル形式の比較

Play Frameworkでも使われているコンフィグライブラリが非常に便利


で、

結論から言うと、 ConfigBeanFactory使うなら、typesafe/Config + lombok が良さそう!


typesafe/Configで、version 1.3から追加されたらしいConfigBeanFactoryクラスを使ってみた。

https://github.com/typesafehub/config#configbeanfactory

自作のjava beanクラス AppConfigを生成させている。

    /**
     * application.confを読み込み、Beanで返す。
     * @return AppConfig
     */
    public static AppConfig getConfig() {
        return ConfigBeanFactory.create(load(), AppConfig.class);
    }

読み込ませたい設定ファイルは、こんな感じで、

webdriver {
    chrome=/usr/local/bin/chromedriver
    ie=/usr/local/bin/iedriver
    firefox=/usr/local/bin/firefoxdriver
}
output{
    dirpath=.
    caseid=case
    image{
        extension=jpg
    }
}
browser{
    width=300
    height=300
}

AppConfigクラスはこんな感じで、フィールド名と設定ファイルのkeyが一致している必要がある。
またフィールドに対応するgetter/setterを記述する必要があるが、
そこをlombokで生成(ここでは @Data)してあげることで、
簡易にConfigBeanを実装することが出来ている。

import lombok.Data;

@Data
public class AppConfig {
    private WebDriverConf webdriver;
    private OutputConf output;
    private BrowserConf browser;
}

フィールドの型はこんな風にネストしてBeanを使うことも可能。

import lombok.Data;

@Data
public class WebDriverConf {
    private String chrome;
    private String ie;
    private String firefox;
}

その他のクラスはgithubにおいてあります。

github.com


個人的にはConfigBeanを作ることで、設定のkeyを管理しなくて良くなったので嬉しかった。

でも欠点は、ConfigBeanの値を変更して設定ファイルに保存(シリアライズ)したい時に、typesafeのConfigやConfigObjectに再変換するのが大変なこと。 たぶん地道にMapにpushするみたく、withValueメソッドを呼びまくらないといけない。

少し調べてstackoverflowのどこかのページで、「typesafe/Configはimmutableな設定を扱うツールだよ :)」とあり、設定の変更はあんまりやらない思想なのかな?ということで諦めモード。

一応config.root().render()シリアライズされた文字列が返るので、それをファイルに保存してやれば良い。
ConfigObjectクラスのrenderメソッド