typesafe/Config ConfigBeanFactoryの良さそうな使い方
設定ファイルを扱いたくて、イマドキどんな形式が良いんだろうなと調べてみたら、 typesafe/ConfigというライブラリでHOCONというファイル形式があるらしい。
紹介記事や簡単な使い方については、以下を参照。
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においてあります。
個人的にはConfigBeanを作ることで、設定のkeyを管理しなくて良くなったので嬉しかった。
でも欠点は、ConfigBeanの値を変更して設定ファイルに保存(シリアライズ)したい時に、typesafeのConfigやConfigObjectに再変換するのが大変なこと。 たぶん地道にMapにpushするみたく、withValueメソッドを呼びまくらないといけない。
少し調べてstackoverflowのどこかのページで、「typesafe/Configはimmutableな設定を扱うツールだよ :)」とあり、設定の変更はあんまりやらない思想なのかな?ということで諦めモード。
一応config.root().render()
でシリアライズされた文字列が返るので、それをファイルに保存してやれば良い。
ConfigObjectクラスのrenderメソッド