Java の Properties 、properties ファイル読込みは古くから存在して過去、
設定ファイル地獄で皆、苦しんだ歴史がある。そして、convention over configuration が提唱され
それでも日本の多くのシステム屋は、うまくバランスを持ってきたとは言い難い。。
properties ファイルの使用と保守は、完全に消滅することはないだろう。
properties ファイルを読むのに、直接 ResourceBundle で読む方法と、あくまでもファイルIOとして
Properties の load メソッドを使う方法、あるだろう。
それから、複数の properties ファイルがある場合に、どう読み込んで管理するとなると、
これもシステムによって様々な方法になってしまう。
直接 ResourceBundle で、読む方法
例えば、システムクラスローダのPATHが通ったとろで、
message.properties というファイルのプロパティを読む、(2バイト文字も読めるようにする)
ResourceBundle rs = ResourceBundle.getBundle("message", new ResourceBundle.Control(){
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format
, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException{
try(InputStreamReader sr = new InputStreamReader(
loader.getResourceAsStream(
toResourceName(toBundleName(baseName, locale), "properties")), "UTF-8");
BufferedReader reader = new BufferedReader(sr)
){
return new PropertyResourceBundle(reader);
}
}
});
Properties p = new Properties();
for(String key : rs.keySet()){
p.setProperty(key,rs.getString(key));
}
こんな感じになる。。。
そこで、今まで Properties の読込みはいくつも過去に書いてきたし整理したくもなり、
まとめた。。。
Properties · yipuran/yipuran-core Wiki · GitHub
このライブラリを使用して、、、
実践的には、Properties 読込み使用の処理を書いていくので、、、
サンプルとしては、、、
import java.util.Properties;
import javax.inject.Inject;
import org.yipuran.env.PropertyInject;
public class Logic{
@Inject @PropertyInject private Properties prop;
public Properties getProperties(){
return prop;
}
}
という、PropertyInject アノテーションで指定する Properties へのインジェクションを
import org.yipuran.env.PropertyBindModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
Injector injector = Guice.createInjector(new PropertyBindModule("message"));
Logic logic = injector.getInstance(Logic.class);
Properties p = logic.getProperties();
この PropertyBindModule で、message.properties に結びつくように、簡潔にするように
yipuran-core ライブラリが提供する処理で実装している
さらに、複数の properties ファイルが存在するケースへの対応を考えて、、
public interface MLogic{
public String getValue(String key);
}
import java.util.Optional;
import java.util.Properties;
import javax.inject.Inject;
import org.yipuran.env.PropertyInject;
public class LogicImpl implements MLogic{
@Inject @PropertyInject("aaa") private Properties propA
@Inject @PropertyInject("bbb") private Properties propB;
@Override
public String getValue(String key){
return Optional.ofNullable(propA.getProperty(key)).orElse( propB.getProperty(key, "not value" ) );
}
}
これで、aaa.properties と bbb.properties 両方を読み込み、aaa.properties に存在しなかったら、
bbb.properties の方の値を探して返す。
という対応をする。
import org.yipuran.env.PropertyBindModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
Injector injector = Guice.createInjector(new PropertyBindModule());
MLogic logic = injector.getInstance(LogicImpl.class);
logic.getValue(key) で Properties の 値を取得