特定のプロファイルが設定されているときにスプリングビーンをロードしない
-
02-01-2020 - |
質問
背景:だから、外部システムをインタフェースするBeanをいくつか持っています。開発のためには、外部システムを偽造し、インターフェースBeanを多数かまたは少ない静的な回答を生み出す実装と交換するのに便利です。だから私がしてきたことは、このようなインターフェース、本当の実装とスタブ実装を作成することです:
public interface ExternalService {
// ...
}
@Service
public class ExternalServiceImpl implements ExternalService {
// ...
}
@Service
@Primary
@Profile({"stub"})
public class StubExternalService implements ExternalService {
// ...
}
.
...とこれはうまく機能します。スタブプロファイルが存在しない場合、スタブビーンはまったくロードされません。存在する場合は、@primary注釈のため、実際の実装にうまく取得します。
問題:しかし、私は実際に同じインターフェースの2つの実装を持っている状況で初めて実行しました。そのうちの1つはプライマリとして定義されていますが、もう1つはアプリケーションコンテキストからロードすることによっても使用できます。
まだそれらの両方を置き換えるためにスタブサービスを作成したいのですが、今回は@Primaryとしてスタブを定義するための私の古い方法は既に1つの主な実装があるためです。基本的に必要なものは、スタブプロファイルが設定されているときにプライマリビーンをロードしない方法ですが、それを正確にする方法については損失します。 Web検索やその他のスタックオーバーフローの質問は、手助けをしていないようです。
解決
は驚くほど簡単でした:プロファイル名の前にノートオペレータ(!
)を追加しました。
@Service
@Primary
@Profile({"!stub"})
public class ExternalServiceImpl implements ExternalService {
// ...
}
.
このように、stub
-Profileがアクティブでない場合にのみロードされます。この機能のサポートが Spring 3.2 M1 。
警告が1つありますが、@Profile({"!stub", "foo"})
を書くと、コンマは "または"ではなく "and"として扱われます。そのため、stub
がアクティブでない場合、またはfoo
がアクティブであった場合、Beanの例はアクティブになります。
edit / add: spring 5.1 プロファイルの新しい式言語:!stub & foo
がアクティブではなく、stub
がアクティブになっていないときに有効になります。大成功!括弧を使用していると、括弧を使用していただきます。