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

Posted

技术标签:

【中文标题】Spring会话范围的bean作为原型bean中的依赖项?【英文标题】:Spring session-scoped beans as dependencies in prototype beans? 【发布时间】:2011-07-13 08:30:30 【问题描述】:

我多次阅读有关此主题的 spring 文档,但有些事情我仍然不清楚。 文档状态:

如果您想将(例如)一个 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 被限定为原型?

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

任何想法都将不胜感激。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于Spring会话范围的bean作为原型bean中的依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Bean作用域实例

是否可以使用会话中的属性配置 Spring 会话范围的 bean?

xml 如果使用JSF作为MVC框架,则使请求和会话范围spring bean可用

java Bean范围(单例,会话,请求,原型)

带有 AOP 的 Spring 会话范围 bean 中的问题

Spring Boot,Spring Security,会话范围 Bean 的会话超时问题,@PreDestroy