web-dev-qa-db-ja.com

春スコープのプロキシBean

誰かがspring @ScopedProxyアノテーションの使用法を説明できますか?私思考それはセッションスコープのBeanと関係がありましたが、何をするのかよくわかりません。

スコープの使用では、@ScopedProxyアノテーションなし(またはaopスコーププロキシなし)のセッションスコープBeanを使用しているため、適切に使用する方法を確信しています。

93
Jeff Storey

セクション3.4.4.5 春のドキュメントのそれはかなりよく説明しています:

(次の「userPreferences」Beanの定義は不完全であることに注意してください):

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

<bean id="userManager" class="com.foo.UserManager">
    <property name="userPreferences" ref="userPreferences"/>
</bean>

上記の構成から、シングルトンBean 'userManager'にHTTPセッションスコープBean 'userPreferences'への参照が挿入されていることは明らかです。ここでの顕著な点は、 'userManager' Beanがシングルトン...であることですコンテナごとに正確に1回インスタンス化されるおよびその依存関係(この場合、「userPreferences」Beanのみ) (一度だけ!)を挿入してください。

これは、「userManager」が(概念的に)まったく同じ「userPreferences」オブジェクト、つまり最初に注入されたオブジェクトに対してのみ動作することを意味します。

これは、HTTPセッションスコープのBeanを依存関係としてコラボレーションオブジェクトに注入する場合(通常)に必要なものではありません。むしろ、私たちが望むのは、コンテナごとに単一の「userManager」オブジェクトです、そしてHTTPセッションの存続期間中、そのHTTPセッションに固有の「userPreferences」オブジェクトを表示して使用したい

むしろ必要なのは、UserPreferencesクラス(理想的にはUserPreferencesインスタンスであるオブジェクト)とまったく同じパブリックインターフェイスを公開し、実際のUserPreferencesオブジェクトを取得して取得できるほどスマートなオブジェクトを挿入することです。基になるスコープメカニズム(HTTPリクエスト、セッションなど)から選択します。その後、このプロキシオブジェクトを「userManager」Beanに安全に挿入できます。これは、保持しているUserPreferences参照がproxy

私たちの場合、UserManagerインスタンスが依存関係によって注入されたUserPreferencesオブジェクトのメソッドを呼び出すとき、それは実際にプロキシのメソッドを呼び出します...その後、プロキシはオフになり、(この場合)HTTPセッションから実際のUserPreferencesオブジェクトをフェッチし、取得した実際のUserPreferencesオブジェクトにメソッド呼び出しを委任します。

そのため、リクエスト、セッション、およびグローバルセッションスコープのBeanをコラボレーションオブジェクトに注入するときに、以下の正しい完全な構成が必要です。

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
    <aop:scoped-proxy/>
</bean>

<bean id="userManager" class="com.foo.UserManager">
    <property name="userPreferences" ref="userPreferences"/>
</bean>
236
Gus

ここで指定されたさまざまなオプションと春のドキュメントを試した後、何らかの理由でSpring MVCを見つけました。@ Controllerアノテーションを使用すると、webappにそのようなコントローラーが複数ある場所でコントローラーを自動配線するのが奇妙です。アノテーションを@RestController(value = "UniqueControllerv1")に変更すると、問題は解決しました。

0
gr12828710