11

我多次阅读有关此主题的春季文档,但有些事情我仍然不清楚。文档指出:

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

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

任何想法将不胜感激。

4

1 回答 1

22

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

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

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

于 2011-03-11T09:07:53.277 回答