2011-03-11 93 views
11

我几次阅读关于这个主题的春季文档,但有些东西对我来说还不清楚。 文档状态:Spring会话范围的bean作为原型bean中的依赖关系吗?

如果要注入(例如)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豆的作用域确定为单例。所以,我想知道这个代理的东西是否应用只有单身作用域的豆,也就是说,如果你想注入web作用域bean到单身bean,或者它也适用于原型豆?例如,如果userManager被限定为原型?

我在问这是因为我看到一些代码将会话范围的bean注入到没有aop代理的原型中,但我不确定这是否正确......特别是那些在某些web中的DAO bean -app,范围为会话,并且它们被注入到用于多用户环境的原型范围的控制器中。这是正确的路吗?一般情况下应该如何将DAO/Service bean作用于web-app环境?

任何想法,将不胜感激。

回答

22

您可以始终将更广泛的bean(例如单例)注入到更窄范围的bean(例如会话范围的bean)中,但反过来,您需要一个scoped-proxy。

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

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

相关问题