1 つのクラスに対して複数の CDI/Weld Bean をインスタンス化するにはどうすればよいですか?
-
22-09-2019 - |
質問
Spring では、xml conf で対応する Bean を定義することで、任意のクラスをインスタンス化することができました。同じクラスに対して異なるパラメータを使用して複数の Bean をインスタンス化することも可能でした。
このような機能は CDI にもありますか。つまり、異なる初期化パラメータを使用して同じクラスの異なるインスタンスを作成することは可能ですか?
クラスを変更せずにBeanを作成することもできますか?つまり、アノテーションを追加せずにBeanを作成することはできますか?
追加した
例を挙げてみましょう。
<bean id="someBean1" class="org.mm.MyBean">
<property name="x" value="xx"/>
<property name="y" value="yy"/>
<property name="z" value="zz"/>
</bean>
<bean id="someBean2" class="org.mm.MyBean">
<property name="x" value="other value"/>
<property name="y" value="yy2"/>
<property name="z" value="zz2"/>
</bean>
同じクラスの 2 つのインスタンスをインスタンス化し、異なるフィールド値で初期化するにはどうすればよいでしょうか?
解決
私が見る限り、2つのオプションがあります:
ユースケースについての詳しい知識がなければ、(模擬) テストまたは構成の問題のために何らかの代替実装 (たとえば、OrderService の別の PaymentProvider) を提供したいと考えていると思います。これは仕様自体でサポートされています。見てください。
@Alternative
ここ (そして、私の最初の間違いを繰り返したり、beans.xml で代替手段を有効にすることを忘れたりしないでください)Spring スタイルの XML 構成を取得するには、次を使用できます。 シーム 3 構成, 、説明どおりの XML 構成が提供されます。ところで、これは JSR 299 の一部でしたが、何らかの理由で仕様から削除されました。
他のヒント
これを行うにはいくつかの方法があります。
例えば。使用@New
プライベート@Inject @New YourBeanのYB。 プライベート@Inject @New YourBean YB2;
この力コンテナはBeanがもともと持っていたもの範囲にかかわらず、新しいインスタンスを作成します。
別の方法は、単に@Dependentは(クラスが全てでアノテートされていない場合BTW(現在の)デフォルト)スコープされているものとしてYourBeanを定義することであろう。
あなたはCDIは、インスタンスの種類を区別するための修飾子法を用いて製造されなければならない複数のインスタンスを持っている場合は、簡単にプロデューサメソッドを使用することができます。
また、あなたは春の道、それを行うにはシームコンフィグを使用することができますが、私はプロデューサメソッドは、これを行うための、よりエレガントな方法だと思います。 ご使用のケースに応じて、@Alternativeある別のオプションがあります。