SpringスコープのプロキシBean


98

誰かが春の@ScopedProxy注釈の使用法を説明できますか?私が思ったことは、セッションスコープのBeanとは何かをしていたが、私はかなり確実ものではありませんよ。

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


Beanのドキュメントを確認しください。セッションはスコープの1つですが、唯一のものではありません。
Gus

1
@Gus、私はスコープを知っていますが、スコーププロキシがどのように機能するかはわかりません
Jeff Storey

1
セクション3.4.4.5は、私の見解では、スコープ付きプロキシが何をするかについてのかなり良い説明です。-2つの例の間にあるビットが重要な部分です。
Gus

2
ええ、それはそれを説明します、ありがとう。質問への回答を追加したい場合は承諾します。
Jeff Storey 2013年

回答:


248

春のドキュメントのセクション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アノテーションを使用すると、プロキシが自動的に使用され、これですべてですか?ScopedProxyは、このクラスをそのまま使用しないでください。プロキシを使用してください。
Koray Tugay

3
私はspring-web:4.3.3を使用していますが、注釈@ScopedProxy@RequestScope他のものに置き換えられたようです。あなたはここに例を見つけることができます。logicbig.com/tutorials/spring-framework/spring-core/...
adebasi

1
表記法@Scope(value="session", proxyMode = ScopedProxyMode.TARGET_CLASS)を使用する場合、SpringMVCはAutowiredにWebApplicationContextを使用せず、代わりにCGLIBを使用してプロキシを作成しますか?例を挙げ
クラピカ

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.