Springのプロファイル機能
プロファイルとは、DIコンテナ内のBeanのグループです。任意のグループ名を指定できます。
Beanにプロファイルを指定するには、 @Profile
アノテーションを利用します。
@Profile("dev")
@Component
public class DevBean {
}
@Profile("production")
@Component
public class ProductionBean {
}
@Profile
が付加されていないBeanは、特定のプロファイルに所属しません(デフォルトプロファイルとも呼ばれます)。プロファイル無しのBeanは、実行時にどんなプロファイルを指定しても常に有効化されます。
@Component
public class DefaultBean {
}
複数プロファイルの指定
@Profile
の value
要素は配列なので、1つのBeanに対して複数のプロファイルを指定可能です。複数指定した場合は、いずれかのプロファイルが実行時に指定された場合に有効化されます(全部のプロファイルが実行時に指定される必要は無いです)。
@Profile({"profile1", "profile2"})
@Component
public class FooBean {
}
論理演算子の利用
!
(否定)、 &
(かつ)、 |
(または)を利用することもできます。
@Profile("!profile1")
@Component
public class FooBean {
}
@Profile("profile1 & profile2")
@Component
public class FooBean {
}
@Profile("profile1 | profile2")
@Component
public class FooBean {
}
&
と|
が混在する場合は、必ず丸括弧()
が必要になります。
❌@Profile("profile1 | profile2 & profile3")
⭕@Profile("profile1 | (profile2 & profile3)")
実行時のプロファイル指定
実行時に「今回はこのプロファイルを使うよ!」と指定する方法はいろいろあります。よく使うのは下記3つです。上のものほど優先順位が高くなります。
- JUnitテストクラスに
@ActiveProfiles("プロファイル名")
を付加する- 複数指定時は配列指定
@ActiveProfiles({"profile1", "profile2"})
- 複数指定時は配列指定
-
java
コマンドに-Dspring.profiles.active=プロファイル名
を付加する- 複数指定時はカンマ区切り
-Dspring.profiles.active=profile1,profile2
- 複数指定時はカンマ区切り
- 環境変数
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に同名のプロパティがあった場合は、**後者の値が優先(=上書き)**されます。
sample.value1=Default1
sample.value2=Default2
# 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
で追加されます)。
サンプルコード