誰かが春の@ScopedProxy
注釈の使用法を説明できますか?私が思ったことは、セッションスコープのBeanとは何かをしていたが、私はかなり確実ものではありませんよ。
私のスコープの使用法では、@ScopedProxy
アノテーションなし(またはaopスコーププロキシなし)のセッションスコープBean を使用したので、適切に使用する方法は確かです。
誰かが春の@ScopedProxy
注釈の使用法を説明できますか?私が思ったことは、セッションスコープのBeanとは何かをしていたが、私はかなり確実ものではありませんよ。
私のスコープの使用法では、@ScopedProxy
アノテーションなし(またはaopスコーププロキシなし)のセッションスコープBean を使用したので、適切に使用する方法は確かです。
回答:
春のドキュメントのセクション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回だけインスタンス化され、その依存関係(この場合は1つだけ、 'userPreferences' Bean)も(1回だけ)インジェクションされます。 )。
これは、「userManager」が(概念的に)まったく同じ「userPreferences」オブジェクト(最初に注入されたオブジェクト)でのみ動作することを意味します。
これは、HTTPセッションスコープのBeanを依存関係として(通常は)協調オブジェクトに注入するときに必要なことではありません。むしろ、私たちが望むを何コンテナあたりのシングル「のUserManager」オブジェクトがあり、その後、HTTPセッションの存続のために、私たちは見てHTTPセッションとに固有のものです「のUserPreferences」オブジェクトを使用します。
むしろ、必要なのは、UserPreferencesクラスとまったく同じパブリックインターフェイスを公開するある種のオブジェクト(理想的には、UserPreferencesインスタンスであるオブジェクト)をインジェクトすることです。選択した基盤となるスコープメカニズム(HTTPリクエスト、セッションなど)から。次に、このプロキシオブジェクトを 'userManager' Beanに安全に挿入できます。これは、保持しているUserPreferences参照がプロキシであることを知らないうちにわかります。
私たちの場合、UserManagerインスタンスが依存関係が注入されたUserPreferencesオブジェクトのメソッドを呼び出すと、実際にはプロキシのメソッドが呼び出されます...プロキシはオフになり、(この場合は)実際のUserPreferencesオブジェクトをフェッチしますHTTPセッション、およびメソッドの呼び出しを、取得した実際の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>
@ScopedProxy
が@RequestScope
他のものに置き換えられたようです。あなたはここに例を見つけることができます。logicbig.com/tutorials/spring-framework/spring-core/...