0

私のXML構成では、これがあります:

<bean id="soap" class="org.grocery.item.Soap" scope="prototype">
        <property name="price" value="20.00" />
</bean>

そして、私のサービスクラスでは、「soap」を次のように自動配線しています。

@Autowired
private Soap soap;
//Accessor methods

そして、次のようなテストクラスを作成しました:

Item soap = service.getItem(ITEM.SOAP);
Item soap2 = service.getItem(ITEM.SOAP);

if(soap2 == soap ){
    System.out.println("SAME REFERENCE");
}

そして、これは私のサービス クラスの getItem メソッドです。

public Item item(Item enumSelector) {
        switch (enumSelector) {
            case SOAP:
                return this.getSoap();
        }
        return null;
    }

@Autowired
private Soap soap;
//Accessor methods

今私が期待しているのは、 this.getSoap(); を呼び出すときです。新しい SOAP オブジェクトを返します。ただし、soap のスコープがプロトタイプとして宣言されているにもかかわらず、そうではありませんでした。何故ですか?

4

2 に答える 2

2

レンジスは彼の答えの中でその理由を説明しました。方法については、これを達成するための2つの方法を知っています。

  1. ルックアップ方法:

石鹸の依存関係をフィールドとして宣言するのではなく、抽象的なゲッターメソッドとして宣言します。

protected abstract Soap getSoap();

(getItemメソッドのように)サービスでsoapが必要なときはいつでも、getterを呼び出します。

xml構成で、Springにそのメソッドを実装するように指示します。

<bean id="service" class="foo.YourService">
  <lookup-method name="getSoap" bean="soapBeanId"/>
</bean>

Springが提供する実装は、呼び出されるたびにSoapの新しいインスタンスをフェッチします。

  1. スコーププロキシ

これは、実際のSoapインスタンスの代わりにプロキシを注入するようにSpringに指示します。挿入されたプロキシメソッドは、正しいsoapインスタンス(プロトタイプBeanであるため新しいもの)を検索し、それらに委任します。

<bean id="soap" class="foo.Soap">
  <aop:scoped-proxy/>
</bean>
于 2013-02-20T10:51:17.813 に答える
2

サービス オブジェクトを作成すると、Spring は SOAP オブジェクトのインスタンスをサービス オブジェクトに注入します。そのため、サービスのすべての呼び出しはgetSoap()、サービスの作成時に注入された同じ SOAP オブジェクトを取得します。

于 2013-02-20T10:14:27.927 に答える