特定のプロファイルが設定されているときにスプリングビーンをロードしない

StackOverflow https://stackoverflow.com//questions/25076557

質問

背景:だから、外部システムをインタフェースする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がアクティブになっていないときに有効になります。大成功!括弧を使用していると、括弧を使用していただきます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top