Spring 上下文中的有状态 bean 和无状态 bean

Posted

技术标签:

【中文标题】Spring 上下文中的有状态 bean 和无状态 bean【英文标题】:Stateful beans and Stateless beans in Spring context 【发布时间】:2011-05-29 05:17:17 【问题描述】:

我正在阅读 spring 的官方文档,在一个地方,我遇到了一条线,它对所有有状态 bean 使用原型范围,而对无状态 bean 使用单例。

我知道 EJB 中有状态 bean 和无状态 bean,但这不是他们在文档中提到的。

谁能向我解释一下 Spring 中的有状态和无状态 bean 到底意味着什么

提前致谢

【问题讨论】:

你能发布一个链接到 Spring 文档中这样说的部分吗? 这里是链接static.springsource.org/spring/docs/3.0.x/… 【参考方案1】:

从春天的角度来看

无状态 bean:单例且仅初始化一次的 bean。他们拥有的唯一状态是共享状态。这些 bean 是在初始化 ApplicationContext 时创建的。 SAME bean 实例将在此 ApplicationContext 的生命周期内返回/注入。

有状态 bean:可以携带状态(实例变量)的 bean。每次需要对象时都会创建这些对象(例如在 java 中使用“new”运算符)。

这些不是 EJB statfull/stateless session beans。

【讨论】:

当你在 Spring 中声明 statefull bean 时?也在应用程序上下文中或其他任何地方? @Pangea 我不明白的一件事是,当单例 bean 处于共享状态时,为什么它们被称为无状态?无论如何,他们将保持共享变量的状态。 @weakstudent,Spring 中的单例与 GoF (docs.spring.io/spring/docs/3.1.x/spring-framework-reference/…) 中描述的不同。基本上,一个写得很好的spring bean应该是无状态的,只有依赖注入、线程本地、实例变量。考虑到这一点,真的没有“全局状态”或共享状态可言。 无状态不是单身!它们是池化的,您不必处理并发性 @cocorossello,通常会存在多少个无状态 bean 实例?它们是在需要时最初创建的,然后汇集起来供以后使用吗?假设池中只有一个无状态 bean,并且有两个客户端试图访问它。在这种情况下是否创建了一个新的无状态 bean?【参考方案2】:

这完全取决于实现。参见 tomee,例如 http://tomee.apache.org/statelesscontainer-config.html 。您必须检查您的服务器文档

【讨论】:

【参考方案3】:

在 Singleton bean 中存储特定信息(如客户端数据)是没有意义的,因为它们仅由 Spring IOC 容器创建一次。这就是为什么单例 bean 是无状态的。它们是共享资源。它们只能用于存储全局信息。

当请求创建一个原型 bean 时,每次都会创建一个新请求。因此,它们可用于为每个请求存储一些特定信息。所以它们是有状态的。

【讨论】:

以上是关于Spring 上下文中的有状态 bean 和无状态 bean的主要内容,如果未能解决你的问题,请参考以下文章

流的有状态和无状态方法

有状态bean和无状态的bean

同一应用程序中的 Spring 和 Jersey State 完整和无状态方法

有状态服务和无状态服务

有状态服务和无状态服务

Spring Security 和无状态的 Restful 服务