arcanum_jp’s blog

おっさんの日記

SprinBootのapplication.propertiesメモ

SpringBootアプリケーションの設定ファイルで、/resources直下に置いておく。起動時にこれが読み込まれる。設定できる一覧はこちらで見れるらしい。こちらは従来からあるプロパティだけど、ymlでも書ける模様だが自分はymlが慣れていないのでここではプロパティファイルについてメモ

docs.spring.io

環境の切り替え

よく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");

似たような方法は以下で見つけましたが、、なんだか面倒なうえあんまりかっこよくは無いですね・・・という事で諦めます。

teratail.com


先の一覧以外の、独自のキーも取得できるようです。上記だとapplications.propertiesにhoge.fuga=piyopiypと書いておくと”piyopiyo”が取得できます。この辺は普通のプロパティファイルと考えればいいみたいです。個人的には取得するキーに対するシンタックスシュガーメソッドが定義したいですね。プログラマに"spring.application.name"とかリテラルでも定数でも指定させんのは嫌なので。