誰かが春の@ScopedProxy
注釈の使い方を説明できますか? セッション スコープ Bean と関係があると思いましたが、よくわかりません。
私のスコープの使用法では、セッション スコープ Bean を@ScopedProxy
アノテーションなしで (または aop スコープ プロキシなしで) 使用したので、それを適切に使用する方法を本当に確信しています。
春のドキュメントのセクション3.4.4.5はそれをかなりよく説明しています:
(以下の 'userPreferences' Bean 定義はそのままでは不完全であることに注意してください):
<!-- an HTTP Session-scoped bean -->
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
<!-- a singleton-scoped bean -->
<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 インスタンスであるオブジェクト) を公開し、実際の UserPreferences オブジェクトを取り出して取得できるほどスマートなオブジェクトを挿入することです。選択した基礎となるスコープメカニズム (HTTP リクエスト、セッションなど) から。その後、このプロキシ オブジェクトを 'userManager' Bean に安全に注入できます。この Bean は、保持している UserPreferences 参照がproxyであることを幸いなことに認識しません。
私たちの場合、依存関係が注入された UserPreferences オブジェクトで UserManager インスタンスがメソッドを呼び出すと、実際にはプロキシでメソッドを呼び出していることになります...その後、プロキシはオフになり、(この場合) から実際の UserPreferences オブジェクトをフェッチします。 HTTP セッションを呼び出し、取得した実際の UserPreferences オブジェクトにメソッド呼び出しを委譲します。
そのため、リクエスト、セッション、および globalSession スコープの 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>
ここで指定されたさまざまなオプションとSpringのドキュメントを試した後、@Controllerアノテーションを使用し、Webアプリケーションにそのようなコントローラーが複数ある場合、何らかの理由でSpring MVCがコントローラーを自動配線することがわかりました。アノテーションを @RestController (value="UniqueControllerv1") に変更し、問題が解決しました。