SprinBootのapplication.propertiesメモ
SpringBootアプリケーションの設定ファイルで、/resources直下に置いておく。起動時にこれが読み込まれる。設定できる一覧はこちらで見れるらしい。こちらは従来からあるプロパティだけど、ymlでも書ける模様だが自分はymlが慣れていないのでここではプロパティファイルについてメモ
環境の切り替え
よくWebアプリケーションを作成している時に必ず作る仕組みが、開発環境、ステージング、本番環境とで環境依存の情報をプロパティファイルに外だしにして、各環境で読み込むファイルを切り替える、war作成時に読み込むファイルを変えるなど。それについてもapplication.propertiesでは可能。
プロファイルと言う仕組みらしい。例えば各環境ごとのキーを以下のように決めておく。これはプロジェクトによって自由に決められるみたい。
- 開発環境:dev
- ステージング:staging
- 本番環境:release
それで、読み込むapplication.propertiesを次のように作り、resourcesの直下に配置する
/resources + application-dev.properties + application-staging.properties + application-release.properties
起動するときに環境を指定することにより起動した時に各環境ごとのapplication.propertiesが読み込まれる。起動方法は次の通り。
コマンドライン引数
java -jar spring-boot-application-demo.jar --spring.profiles.active=release
VMの起動引数
java -jar -Dspring.profiles.active=dev spring-boot-application-demo.jar
環境変数にセット
SPRING_PROFILES_ACTIVEというキーで環境変数を設定しておく
プログラム中からのapplication.properties参照方法
application.properties参照用のクラスを定義します。@PropertySourceのclasspathで読み込むプロパティファイルを指定するようです。resourcesからの相対パスで指定します。
@Configuration @PropertySource("classpath:application.properties") public class MyProperties { @Autowired private Environment _env; public String getValue(String key) { return _env.getProperty(key); } }
これを使用するクラス側で使います
@RestController public class HelloController { @Autowired MyProperties _prop; @RequestMapping(value="/", method=RequestMethod.GET) public ModelAndView index(ModelAndView mav, HttpServletRequest req, HttpServletResponse resp) { Log log = LogFactory.getLog(getClass()); log.debug("hoge.fuga : " + _prop.getValue("hoge.fuga")); log.debug("spring.application.name : " + _prop.getValue("spring.application.name")); ... }
まだあんまりDIの事がわかってないのですが、インスタンスはインスタンス変数でインジェクトしてもらう必要があるって事なんでしょうかね。個人的にはシングルトンにしてこんな風に使いたいんですが・・・
MyProperties p = MyProperties.getInstance(); String hoge = p.getValue("hoge.fuga");
似たような方法は以下で見つけましたが、、なんだか面倒なうえあんまりかっこよくは無いですね・・・という事で諦めます。
先の一覧以外の、独自のキーも取得できるようです。上記だとapplications.propertiesにhoge.fuga=piyopiypと書いておくと”piyopiyo”が取得できます。この辺は普通のプロパティファイルと考えればいいみたいです。個人的には取得するキーに対するシンタックスシュガーメソッドが定義したいですね。プログラマに"spring.application.name"とかリテラルでも定数でも指定させんのは嫌なので。