web-dev-qa-db-ja.com

セッションBean /プロトタイプBeanを参照するシングルトンBeanに対して作成されたインスタンスの数

Springを使用した場合、以下で説明するシナリオで作成されるインスタンスの数については疑問があります。

Beanの構成は次のようになります

  <bean id="a" class="A">
    <property name="b" ref="b"/>
    </bean>

<bean id="b" class="B" scope="session"/> or

 <bean id="b" class="B" scope="prototype"/>

デフォルトでは、Bean "a"にはsingleton scope。そのため、セッションスコープまたはプロトタイプスコープを持つBeanへの参照を持つシングルトンBeanがあります。

この場合、アプリケーションへの同時リクエストが2つある場合、Aのインスタンスがいくつ作成され、Bのインスタンスがいくつ作成されますか?

これがどのように機能するかを説明できる人がいれば、とても助かりますか?

ありがとう、Divya

25
user1477232

シングルトンスコープ

Beanがsingletonの場合、Beanの1つの共有インスタンスのみが管理され、そのBean定義に一致する1つまたは複数のIDを持つBeanに対するすべてのリクエストは、Springによって返される1つの特定のBeanインスタンスになります容器。

別の言い方をすれば、Bean定義を定義し、singletonとしてスコープされている場合、Spring IoC containerはそのBean定義で定義されたcreate exactly one instance of the objectになります。この単一のインスタンスは、そのようなシングルトンBeanのキャッシュに格納され、その名前付きBeanに対する後続のすべてのリクエストと参照により、キャッシュされたオブジェクトが返されます。

セッションスコープ

上記のBean定義を適切に設定すると、Springコンテナはlifetime of a single HTTP Sessionに対してBeanの新しいインスタンスを作成します。

Springフレームワークのリファレンスによると、「lives longer」(この場合はシングルトンBean)が比較的短い寿命を持つ別のクラスでインジェクションする必要がある場合、別のアプローチに従う必要があります。スコープBean)。ただし、プロトタイプとシングルトンのスコープではアプローチが異なります。

XMLで必要なのは、singletonBeanインスタンスを1回だけインスタンス化し、sessionBeanでインジェクトすることです。ただし、sessionBeanはセッションスコープ(すべてのセッションで再インスタンス化する必要があることを意味する)であるため、構成はあいまいです(インスタンス化時に依存関係が設定され、セッションスコープの値も後で変更できるため)。

そのため、そのクラスを注入する代わりに、sessionBeanとまったく同じパブリックインターフェイスを公開するプロキシを注入します。コンテナは、このプロキシオブジェクトをsingletonBean Beanに注入します。これは、このsessionBean参照がプロキシであることを認識しません。 sessionBeanでこのタグを記述することで指定します。

<aop:scoped-proxy/>

XML構成:

<bean name="singletonBean" class="somepkg.SingletonBean">
<property name="someProperty" ref="sessionBean"/>
</bean>

<bean name="sessionBean" class="somepkg.SessionBean" scope="session">
<aop:scoped-proxy/>
</bean>

singletonBeanインスタンスが依存関係を挿入したsessionBeanオブジェクトのメソッドを呼び出すとき、実際にはプロキシのメソッドを呼び出しています。次に、プロキシは(この場合)HTTPセッションから実際のsessionBeanオブジェクトをフェッチし、メソッド呼び出しを取得した実際のsessionBeanオブジェクトに委任します。

また、詳細については this を参照してください。

プロトタイプBean依存関係を持つシングルトンBean

ルックアップメソッドインジェクション

singleton-scopedへの依存関係を持つprototype beans Beanを使用する場合、依存関係はインスタンス化時に解決されることに注意してください。したがって、prototype-scoped BeanをシングルトンスコープのBeanに依存性注入すると、新しいプロトタイプBeanがインスタンス化され、シングルトンBeanに依存性注入されます。プロトタイプインスタンスは、シングルトンスコープBeanに提供される唯一のインスタンスです。

ただし、シングルトンスコープのBeanに、プロトタイプスコープのBeanの新しいインスタンスを実行時に繰り返し取得する必要があるとします。プロトタイプスコープBeanをシングルトンBeanに依存性注入することはできません。その注入は、SpringコンテナがシングルトンBeanをインスタンス化し、依存性を解決および注入するときに1回しか発生しないためです。

<!-- a stateful bean deployed as a prototype (non-singleton) -->
<bean id="command" class="fiona.Apple.AsyncCommand" scope="prototype">
  <!-- inject dependencies here as required -->
</bean>

<!-- commandProcessor uses statefulCommandHelper -->
<bean id="commandManager" class="fiona.Apple.CommandManager">
  <lookup-method name="createCommand" bean="command"/>
</bean>

Lookup methodインジェクションは、コンテナのoverride methods on container管理対象Beanへの機能であり、コンテナ内の別の名前付きBeanの検索結果を返します。前のセクションで説明したシナリオのように、lookupには通常prototype beanが含まれます。 Spring Frameworkは、CGLIB libraryからのバイトコード生成を使用してこのメ​​ソッドインジェクションを実装し、メソッドをオーバーライドするサブクラスを動的に生成します。

lookup method injection を参照してください。

フォロー より詳細な例と情報が必要です。

36
Ankur Singhal

質問で述べた方法を使用すると、spring IOC createは常にシングルトンと同じオブジェクトを返します。シングルトン内にプロトタイプBeanを注入するには、2つの方法があります

1)ルックアップメソッドインジェクション

2)スコーププロキシ

詳細を参照してください こちら

0
Surya