こんにちは、さるまりんです。
Spring Bootで開発していると、状況に応じて異なるプロパティを使い分けたい場合があります。
例えば、テスト時には異なるデータベースに接続したい場合や、APIのスタブを提供する環境では本来の処理をスキップしたクラスをロードしたい場合などが考えられます。
Spring Bootのjarファイルを実行する際に、次のようにどのプロファイルを有効にするかを指定できます。
java -jar -Dspring.profiles.active=production someapp.jar
または
java -jar -Dspring.profiles.active=dummy someapp.jar
この方法を利用して、プロパティファイルを読み替えてみましょう。
以下は、二つのクラスの冒頭部分です。
SomeConfig.java
@Profile("!dummy")
@Configuration
@PropertySource("classpath:some.properties")
public class SomeConfig {
// クラスの内容
}
DummySomeConfig.java
@Profile("dummy")
@Configuration
@PropertySource("classpath:somedummy.properties")
public class DummySomeConfig {
// クラスの内容
}
これらのクラスでは、@Configuration
アノテーションと @PropertySource
アノテーションを使ってプロパティファイルを読み込むクラスを作成しています。
さらに、@Profile
アノテーションを用いて、特定のプロファイルが有効なときにそのクラスを使用するかどうかを指定しています。
SomeConfig
クラスは@Profile("!dummy")
が、DummySomeConfig
クラスは@Profile("dummy")
がそれぞれ指定されています。
つまり、DummySomeConfig
はdummy
プロファイルが有効なときに使用され、SomeConfig
はその反対で、dummy
プロファイルが有効でないときに使用されます。
これにより、同じ名前のプロパティであっても、異なる値を使い分けることができます。
たとえば、APIスタブを作成する際に、スタブを提供する環境ではダミーのサービスクラスで固定値のレスポンスを作成し、それ以外の環境では実処理を含むサービスクラスでレスポンスを作成するためにこの機能を利用しました。
もっと適切で簡単な方法があるかもしれませんが、今回はこの方法で解決しました。
Spring Bootにはさまざまな機能があるので、便利に使いつつも、事故がないように注意したいですね。
読んでくださってありがとうございました。
それではまた!