1

たとえば、シナリオがあります。

<bean id="xyzService" class="XyzServiceImpl" scope="prototype">
    <property name="aDependency" ref="aDependency" />
    <property name="bDependency" ref="bDependency" />
</bean>

<bean id="useService" class="UseServiceImpl">
    <property name="xyzService" ref="xyzService"/>
</bean>

Java クラス :

public class XyzServiceImpl implements XyzService{
     private ADependency aDependency= null;
   private BDependency bDependency= null;
   // getters and setters...
}

 public class UseServiceImpl implements UseService {
     private XyzService xyzService= null;
 // getters and setters...
    xyzService.doSomething();
}

UseServiceImpl 内では毎回、xyzService の新しいインスタンスが期待されますが、常に同じシングルトン インスタンスが返されます。aDependencyまた、とbDependencyが内部的に他の Bean への参照をさらにいくつか持つ可能性があるというシナリオもあります。

ここで、xyzService の新しいインスタンスを取得するにはどうすればよいかという質問があります。私は何か間違ったことをしていますか?

4

4 に答える 4

1

デフォルトでは、Spring Bean のスコープは です。Springに指示singletonするスコープをマークする必要がありますprototype

<bean id="beanId" class="some.class.Name" scope="prototype"/>

Spring は Bean のリクエストごとに新しいインスタンスを作成します


見る

于 2012-06-15T05:49:04.017 に答える
0

ApplicationContextAwareコンテキストのゲッター メソッドとセッター メソッドを持つインターフェイスを実装することで、簡単に解決策を見つけることができました。コンテキストから、getBean と言って新しいインスタンスを取得できます

public class UseServiceImpl implements UseService,ApplicationContextAware {
     private ApplicationContext context;
     XyzService xyzService= context.getBean(XyzServiceImpl.class);
   // getter and setter for applicationContext
     private XyzService xyzService= null;
   // getters and setters...
    xyzService.doSomething();
}
于 2012-06-15T11:37:04.040 に答える
0

あなたの例では、スプリング コンテナにuserServiceのインスタンスをリクエストするたびに、シングルトン インスタンスが返され、 xyzServiceの新しいインスタンスが注入されます。

ただし、 Spring がxyzServiceの新しいインスタンスを作成するときは、別の方法でプロトタイプとしても定義されていない限り、 aDependencybDependencyのシングルトン インスタンスを使用します。

于 2012-06-16T02:30:17.113 に答える
0

次のものがある場合:

<bean id="xyzService" class="XyzServiceImpl" scope="prototype">
    <property name="aDependency" ref="aDependency" />
    <property name="bDependency" ref="bDependency" />
</bean>

<bean id="useService1" class="UseServiceImpl">
    <property name="xyzService" ref="xyzService"/>
</bean>

<bean id="useService2" class="UseServiceImpl">
    <property name="xyzService" ref="xyzService"/>
</bean>

次に、とのxyzServiceプロパティに の異なるインスタンスが含まれていることを確認できるはずです。これは、スコープがプロトタイプとして宣言されていることの効果です。Bean の存続期間中にその Bean の新しいインスタンスを本当に利用できるようにしたい場合は、別のアプローチが必要になると思います。メソッド インジェクションのドキュメントを参照してください。useService1useService2xyzServicexyzServicexyzServiceuseService

于 2012-06-15T15:04:05.317 に答える