11

この件に関する春のドキュメントを何度か読みましたが、まだ不明な点があります。ドキュメントの状態:

たとえば、HTTP リクエスト スコープ Bean を別の Bean に注入する場合は、スコープ Bean の代わりに AOP プロキシを注入する必要があります。つまり、スコープ オブジェクトと同じパブリック インターフェイスを公開するが、関連するスコープ (HTTP 要求など) から実際のターゲット オブジェクトを取得し、メソッド呼び出しを実際のオブジェクトに委任することもできるプロキシ オブジェクトを挿入する必要があります。 .

構成例は次のとおりです。

<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>

ここで、userManager Bean はシングルトンとしてスコープされます。それで、このプロキシのことはシングルトン スコープの Bean にのみ適用されるのか、つまり、Web スコープの Bean をシングルトン Bean に注入したいのか、それともプロトタイプ Bean にも適用されるのか疑問に思っています。たとえば、userManagerがプロトタイプとしてスコープされた場合はどうなりますか?

セッション スコープの Bean を aop-proxy なしでプロトタイプに挿入するコードを見たので、これを尋ねていますが、これが正しいかどうかはわかりません... sessionとして、それらはマルチユーザー環境用のプロトタイプ スコープのコントローラーに注入されました。これは正しい方法ですか?一般に、Web アプリ環境で DAO/サービス Bean のスコープをどのように設定する必要がありますか?

任意のアイデアをいただければ幸いです。

4

1 に答える 1

22

スコープの広い Bean (シングルトンなど) をスコープの狭い Bean (セッション スコープの Bean など) にいつでも注入できますが、その逆の場合は、スコープ プロキシが必要です。

したがって、セッション スコープの Bean をプロトタイプ スコープの Bean に注入する例は問題ありません。セッション スコープはプロトタイプ スコープよりも「広い」からです。

間違っている場合は、Spring が教えてくれます。それが文句を言わないなら、あなたはそれを必要としません。

于 2011-03-11T09:07:53.277 に答える