Spring会话范围的bean作为原型bean中的依赖项?

Les*_*ess 11 spring scope dao javabeans httpsession

我曾多次阅读关于这个主题的春季文档,但有些事情对我来说仍然不清楚.文件说明:

如果要将(例如)HTTP请求作用域bean注入另一个bean,则必须注入AOP代理来代替作用域bean.也就是说,您需要注入一个代理对象,该对象公开与范围对象相同的公共接口,但也可以从相关范围(例如,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>
Run Code Online (Sandbox Code Playgroud)

这里,userManager bean的范围是singleton.所以,我想知道这个代理事物是否适用于单例范围的bean,也就是说,如果你想将web-scoped bean注入单例bean,或者它也适用于原型bean?例如,如果userManager的范围是原型?

我问这个是因为我看到一些代码在不使用aop-proxy的情况下将会话范围的bean注入到原型中,但我不确定这是否正确...特别是那些在某些web-app中的DAO bean,scoped作为会话,它们被注入到原型范围的控制器中,用于多用户环境.这是正确的方法吗?一般来说,应该如何在Web应用程序环境中使用DAO/Service bean?

任何想法将不胜感激.

ska*_*man 22

您总是可以将范围更广的bean(例如单例)注入到更窄范围的bean中(例如,会话范围的bean),但反过来说,您需要一个范围代理.

因此,将会话范围的bean注入到原型范围的bean中的示例很好,因为会话范围比原型范围"更宽".

如果你弄错了,那么Spring会告诉你的.如果它没有抱怨,那么你不需要它.