0

Bean が XML で構成されている場合、そのコンストラクターへの入力パラメーターは常に同じなので、スコープをプロトタイプとして宣言しても、クラスのインスタンスのメンバーはすべてのオブジェクトで同じになりますか? それで、それはどのようにプロトタイプですか?

例として、コンストラクターが整数の引数を取るクラスがあるとします。

A(int i){}

XML Bean を使用して構成した場合、パラメーターの値はiそこにハードコーディングされませんか? iまたは、クラスをインスタンス化する必要があるたびに異なる値を渡す方法はありますか?

4

3 に答える 3

1

同じクラスに対して必要な数のプロトタイプを宣言できます。

<bean id="beanNegative" class="MyBean" scope="prototype">
        <constructor-arg index="0" type="java.lang.Integer" value="-1"/>
</bean>

<bean id="beanPositive" class="MyBean" scope="prototype">
        <constructor-arg index="0" type="java.lang.Integer" value="1"/>
</bean>

<bean id="beanNeutral" class="MyBean" scope="prototype">
        <constructor-arg index="0" type="java.lang.Integer" value="0"/>
</bean>

value="-1"、value="1"、value="0"およびプロトタイプの名前のみが変更されます。

当然のことながら、そのクラスのインスタンスが複数ある瞬間から、クラスごとに自動配線を行うことは不可能になります。依存する Bean に注入するプロトタイプ インスタンスを明示的に指定する必要があります。

また、Bean が Spring から取得されるたびに新しいインスタンスになるという点で、プロトタイプはシングルトンとは異なりますが、シングルトンはアプリ内の他のすべての Bean に同じインスタンスを提供します。

よろしく、 Zied Hamdi - http://1vu.fr

于 2013-07-20T00:42:11.210 に答える
1

getBean を直接使用するときに値を指定できます。より洗練されたソリューションについては、春のドキュメントで「メソッド注入」を調べてください。

<bean id="beanA" class="A" scope="prototype">
        <constructor-arg index="0" type="java.lang.Integer" value="null"/>
</bean>

A bean = (A) applicationContext.getBean("beanA", new Object[]{someInteger});
于 2013-07-19T20:56:22.237 に答える
1

作成直後は、すべてのインスタンスが同じになります。しかし、それらがステートフルである場合、いくつかの操作の後、それらは同じではありません。

もちろん、Bean がステートレスである場合、プロトタイプにするメリットはないと思います。

最後の質問に関しては、SpringEL を使用して、たとえば、毎回異なる値を返すメソッドを呼び出すことができます。そうすれば、作成後にすべてのインスタンスが異なります。

于 2013-07-19T20:56:32.040 に答える