Springのプロファイル機能、そしてSpring Bootのapplication.properties


Springのプロファイル機能

プロファイルとは、DIコンテナ内のBeanのグループです。任意のグループ名を指定できます。

Beanにプロファイルを指定するには、 @Profile アノテーションを利用します。

DevBean.java
@Profile("dev")
@Component
public class DevBean {
}
ProductionBean.java
@Profile("production")
@Component
public class ProductionBean {
}

@Profile が付加されていないBeanは、特定のプロファイルに所属しません(デフォルトプロファイルとも呼ばれます)。プロファイル無しのBeanは、実行時にどんなプロファイルを指定しても常に有効化されます。

DefaultBean.java
@Component
public class DefaultBean {
}

複数プロファイルの指定

@Profilevalue 要素は配列なので、1つのBeanに対して複数のプロファイルを指定可能です。複数指定した場合は、いずれかのプロファイルが実行時に指定された場合に有効化されます(全部のプロファイルが実行時に指定される必要は無いです)。

@Profile({"profile1", "profile2"})
@Component
public class FooBean {
}

論理演算子の利用

! (否定)、 & (かつ)、 | (または)を利用することもできます。

profile1以外で有効化される
@Profile("!profile1")
@Component
public class FooBean {
}
実行時にprofile1とprofile2が両方指定された場合に有効化される
@Profile("profile1 & profile2")
@Component
public class FooBean {
}
実行時にprofile1またはprofile2が指定された場合に有効化される
@Profile("profile1 | profile2")
@Component
public class FooBean {
}

&| が混在する場合は、必ず丸括弧 () が必要になります。
@Profile("profile1 | profile2 & profile3")
@Profile("profile1 | (profile2 & profile3)")

実行時のプロファイル指定

実行時に「今回はこのプロファイルを使うよ!」と指定する方法はいろいろあります。よく使うのは下記3つです。上のものほど優先順位が高くなります。

  1. JUnitテストクラスに @ActiveProfiles("プロファイル名") を付加する
    • 複数指定時は配列指定 @ActiveProfiles({"profile1", "profile2"})
  2. java コマンドに -Dspring.profiles.active=プロファイル名 を付加する
    • 複数指定時はカンマ区切り -Dspring.profiles.active=profile1,profile2
  3. 環境変数 SPRING_PROFILES_ACTIVE にプロファイル名を指定する
    • 複数指定時はカンマ区切り SPRING_PROFILES_ACTIVE=profile1,profile2

前述の通り一番の注意点は、実行時にどんなプロファイルを指定しても、プロファイル無しのBeanは常に使われるということです。

Spring Bootのapplication.properties

Spring Boot利用時は、設定ファイルapplication.propertiesもプロファイルが利用できます。application.propertiesはプロファイル無し、application-プロファイル名.propertiesはそのプロファイル指定時のみ使われる設定になります。

つまり、 application.propertiesに書いた設定は、どんなプロファイルを指定しても使われるということです。

プロファイルを指定した上で、application.propertiesとapplication-プロファイル名.propertiesに同名のプロパティがあった場合は、後者の値が優先(=上書き)されます。

application.properties
sample.value1=Default1
sample.value2=Default2
application-dev.properties
# devプロファイル指定時はこちらの値が使われる
sample.value1=Dev1

Spring Bootを利用した場合の実行時プロファイル指定

Spring Bootを利用している場合は、前述の指定方法に加えてコマンドライン引数で指定する方法があります。

コマンドライン引数でのプロファイル指定
$ java -jar target/spring-boot-profiles-sample-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

IntelliJ IDEA(Ultimate Editionのみ)の場合は、実行設定に指定することができます(実行時に -D で追加されます)。

サンプルコード

参考資料