Tagbangers Blog

Spring Bootがプロパティファイルを読み込む方法に一同驚愕!!

こんにちは、インターン生の古家です。

今回はSpring Bootのプロパティファイルの理解を深めるために調査を行い、まとめてみました。


プロパティとは?

SpringBootではアプリケーションコードの外に設定値を持つことができます。

この設定値がプロパティと呼ばれています。

ファイル形式は.propertiesと.ymlを使用でき、その他にも環境変数やコマンドライン引数を用いて設定値を与えることができます。


プロパティ値を直接ぶっこむ2つの方法

以下のアノテーションを使うとBeanに対して直接プロパティ値を与えることができます。

@Value

フィールドを@Valueアノテーションで装飾して直接値をBeanに注入することができます。

@Value("${name}")
    private String name;

@ConfigurationProperties

POJOクラスを@ConfigurationPropertiesで装飾し、その属性でプロパティのprefixを指定すると、そのprefixを持ったプロパティをまるっとオブジェクトにぶっこむこともできます。

例えば

spring.datasource.username=hoge
spring.datasource.password=hogehoge

というプロパティがあったら、

@ConfigurationProperties(prefix = "spring.datasource")
public class DataSource {
    String username;
    String password;
}

とすると、usernameにはhoge、passwordにはhogehogeを入れてくれます。


そもそもプロパティはどこから読み込まれるのか?

よく使われるのはapplication.propertiesやapplication.ymlファイルですよね。

SpringApplicationは、これらのプロパティファイルを以下の場所から探し出します(優先順位高い順):

1./configという名前のサブディレクトリ(file:./config/)

2.カレントディレクトリ(file:./)

3.クラスパスの/configパッケージ(classpath:/config/)

4.クラスパスルート(classpath:/)


...あれ?src/main/resources/じゃないの?

もしそう思ったら、あなたは一人じゃありません。僕も思いました。

実はsrc/main/resourcesディレクトリはMavenのデフォルトのクラスパスの一つです。

そのためsrc/main/resourcesディレクトリは4.クラスパスルートに含まれ、その配下にあるapplication.propertiesファイルはSpring Bootが自動で読み込んでくれます。


もし上記4つ以外の場所からプロパティを読み込ませたい場合は、@Configurationクラスに@PropertySourceアノテーションを付与し、任意のクラスパスを指定してあげるとそこにもプロパティを探しに行ってくれます。

 @Configuration
 @PropertySource("classpath:/com/myco/app.properties")
 public class AppConfig {


プロファイル別にアプリケーションプロパティファイルを作る

ローカル、テスト環境、本番環境でプロパティを分けたいときもありますよね。

そんな時のために、

application-{profile}.properties

という命名規則に従ってプロパティファイルを作成することで、プロファイル別に作ることもできます。

プロファイルが設定されている時は、そのプロファイルにあったプロパティファイルが優先的に読み込まれます。

もしプロファイルがデフォルトのままであれば、デフォルトの

application-default.properties

application.properties

が読み込まれます。


おまけ:びっくら仰天!実は17個もあるSpring Bootのプロパティ設定方法

これらは以下の通りの優先順位に沿って読み込まれます:

  1. ~/.spring-boot-devtools.properties (devtoolsが有効な場合)
  2. @TestPropertySourceアノテーション
  3. テスト内のproperties属性(@SpringBootTestなどで使える)
  4. コマンドライン引数
  5. SPRING_APPLICATION_JSON(環境変数)
  6. ServletConfig
  7. ServletContext
  8. java:comp/env内のJNDI属性
  9. Javaのシステムプロパティ(System.getProperties())
  10. OS環境変数
  11. random.*で設定される、RandomValuePropertySource
  12. パッケージされたjarファイル外の、特定のプロファイルのアプリケーションプロパティファイル
  13. パッケージされたjarファイル内の、特定のプロファイルのアプリケーションプロパティファイル
  14. パッケージされたjarファイル外のアプリケーションプロパティファイル
  15. パッケージされたjarファイル内のアプリケーションプロパティファイル
  16. @Configurationで装飾されたクラス内の@PropertySourceアノテーション
  17. デフォルトプロパティ(SpringApplication.setDefaultPropertiesでセットできる)


参考文献