6

Springでは、xml confで対応するBeanを定義することにより、任意のクラスをインスタンス化することが可能でした。同じクラスに対して、異なるパラメーターを使用して複数のBeanをインスタンス化することも可能でした。

CDIにもそのような機能がありますか?つまり、異なる初期化パラメーターを使用して同じクラスの異なるインスタンスを作成することは可能ですか?

クラスを変更せずに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つのインスタンスをインスタンス化し、異なるフィールド値で初期化するにはどうすればよいですか?

4

3 に答える 3

4

私が見る限り、2つのオプション:

  • ユースケースについてさらに知識がなくても、(モック)テストまたは構成の問題(たとえば、OrderServiceの別のPaymentProvider)の代替実装を提供したいと思います。これは仕様自体によってサポートされています。@Alternative ここをご覧ください(最初の間違いを繰り返さず、beans.xmlで代替をアクティブ化することを忘れないでください)

  • SpringスタイルのXML構成を取得するには、Seam 3 Configを使用できます。これは、説明されているとおりにXML構成を提供します。ところで、これはJSR 299の一部ですが、何らかの理由で仕様から削除されました。

于 2011-04-04T14:05:25.610 に答える
2

プロデューサーメソッドは簡単に使用できます。メソッドによって生成されるインスタンスが複数ある場合は、CDI修飾子を使用してさまざまなタイプのインスタンスを区別します。

また、Seam Configを使用してSpringの方法で実行することもできますが、プロデューサーメソッドの方がより洗練された方法だと思います。ユースケースに応じて、@Alternativeという別のオプションがあります。

于 2012-05-22T04:00:04.960 に答える
2

それを行うにはいくつかの方法があります。

たとえば、@Newを使用します

private @Inject @New YourBean yb; private @Inject @New YourBean yb2;

これにより、Beanが最初に持っていたスコープに関係なく、コンテナは新しいインスタンスを作成します。

もう1つの方法は、YourBeanを@Dependentスコープとして定義することです(これは、クラスに注釈が付けられていない場合のデフォルトです(現在)。

于 2010-02-26T18:15:56.427 に答える