Spring Boot で複数の @ConfigurationProperties のプロパティを読み込む

src/main/resources に application.properties があって、プロジェクト直下に config/application-env.properties があるとする。このとき、両方のプロパティファイルを読み込むことを検証したい。

プロパティファイルの内容は次の通り。

  • src/main/resources/application.properties
app.foo=foofoo
app.bar=barbar
  • config/application-env.properties
env.hoge=hogehoge
env.fuga=fugafuga

それぞれのプロパティファイルに対応する Bean を用意する。

  • application.properties に対応する Bean
@Component
@ConfigurationProperties(prefix = "app")
public class ApplicationProperties {
    private String foo;
    private String bar;
    // getter/setter は省略
}
  • application-env.properties に対応する Bean
@Component
@ConfigurationProperties(prefix = "env")
public class ApplicationEnvProperties {
    private String hoge;
    private String fuga;
    // getter/setter は省略
}

プロパティを使うときは、それぞれの Bean を DI して使う。

@Autowired
private ApplicationProperties appProp;
@Autowired
private ApplicationEnvProperties envProp;

...

appProp.getFoo()); // foofoo
appProp.getBar()); // barbar
envProp.getHoge()); // hogehoge
envProp.getFuga()); // fugafuga

尚、application-env.properties を読み込むには、アプリケーションの実行時に -Dspring.config.location=config/application-env.propertiesVM 引数に渡す必要がある。

まとめ

VM 引数に -Dspring.config.location=config/application-env.properties を指定した場合、application-env.properties しか読み込まれないかと思っていたら、クラスパス上にある application.properties も普通に読み込まれていたので、特に深く考える必要はなかった模様...。