@SessionScoped
表示一个范围,同时@Stateful
在某种程度上我们现在称之为刻板印象。@Stateful
向 bean 添加多项服务,其中包括事务行为和钝化。
中央至@Stateful
然而,它的会话行为确实与会话范围重叠。
不同之处在于会话范围与 HTTP 会话相关联,而@Stateful
是一个开放式的用户管理会话,其生命周期由具有对 Bean 代理引用的客户端管理。
@Stateful
远程 bean 最初是 Servlet 的二进制 (RMI) 计数器部分。 Servlet 监听来自浏览器的远程 HTTP 请求,@Stateful
远程 bean 侦听来自 Applet(以及后来的 Swing 客户端)的远程 RMI 请求。
不幸的是,两者之间存在许多不一致之处。 Servlet 只是一个 HTTP 监听器,而@Stateful
beans 自动引入了许多其他功能。 Servlet 还与所有其他 Servlet 共享会话,并且还与战争中的所有其他 Servlet 共享 Java EE 组件名称空间,同时与@Stateful
EJB 每个单独的 bean 都有自己的会话和组件名称空间。
随着 EJB 2 中本地 Bean 的引入以及用于远程 EJB 通信的 Swing/Applet 客户端的急剧减少,为@Stateful
bean 变得不太清晰了。
我认为这样说是公平的@Stateful
现在已经不那么常用了。对于 Web 应用程序,HTTP 会话几乎总是领先,这意味着使用会话范围和本地@Stateless
用于业务逻辑的 bean 和/或 CDI bean。
在某些情况下@Stateful
bean 是必需的,因为它们对 JPA 的扩展持久性上下文的天然支持以及它们的钝化功能(Servlet 没有标准化的钝化机制)。注意@Stateful
and @SessionScoped
(或许多其他范围)可以组合。组合它们的优点是用户代码不再需要管理生命周期,而是由容器来管理。
有一个有点类似的故事@ApplicationScoped
and @Singleton
,尽管没有遗产(@Singleton
是一个相当新的事物)。@ApplicationScoped
只是一个范围,而@Singleton
是一个 bean 类型(如果您愿意,则为构造型),它不仅为您提供应用程序范围的行为,而且还为您再次提供事务行为,具有自动锁定(可以通过@Lock
)并具有急切的施工行为(通过@Startup
).
虽然@Stateful
and @Singleton
本身就非常方便,Java EE 中当前的前进方向似乎是将这些内置构造型分解为单独可用的注释,谁知道呢,也许有一天它们将成为由这些分解的注释组成的实际 CDI 构造型。