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

时间:2011-03-11 08:59:08

标签: 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>

此处, userManager bean的范围为singleton。所以,我想知道这个代理服务器是否只将 应用于单例范围的bean,也就是说,如果你想将web-scoped bean注入单例bean,或者它还适用于原型bean?例如,如果 userManager 的范围是原型?

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

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:22)

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

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

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