差异:@SessionScoped 与 @Stateful 和 @ApplicationScoped 与 @Singleton [已关闭]

问题描述 投票:0回答:1

我想知道,以下之间的主要区别是什么:

  1. javax.enterprise.context.SessionScopedjavax.ejb.Stateful
  2. javax.enterprise.context.ApplicationScoped 和 javax.ejb.Singleton

我知道 @SessionScoped@Stateful 允许为每个客户端创建一个新实例。我还知道,对于 @ApplicationScoped@Singleton / @Stateless,它们是在客户端之间共享的。

=> 但是我什么时候应该考虑选择EJB还是其他更好?

java singleton ejb stateless stateful
1个回答
32
投票

@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
beans 和/或 CDI beans 进行业务逻辑。

在某些情况下,需要

@Stateful
beans,因为它们对 JPA 的扩展持久性上下文的天然支持及其钝化功能(Servlet 没有标准化的钝化机制)。请注意,
@Stateful
@SessionScoped
(或许多其他范围)可以组合。组合它们的好处是用户代码不再需要管理生命周期,而是由容器来管理。

@ApplicationScoped
@Singleton
有一个有点相似的故事,尽管没有遗产(
@Singleton
是一个相当新的事物)。
@ApplicationScoped
只是一个范围,而
@Singleton
是一个 bean 类型(如果您愿意的话,可以是构造型),它不仅为您提供应用程序范围的行为,而且还为您再次提供事务行为,具有自动锁定(可以是通过
@Lock
进行调整)并具有急切的构建行为(通过
@Startup
)。

虽然

@Stateful
@Singleton
本身非常方便,但 Java EE 中当前的前进方向似乎是将这些内置构造型分解为单独可用的注释,谁知道呢,也许有一天它们将成为实际的 CDI 构造型,其中包含这些分解的注释。

© www.soinside.com 2019 - 2024. All rights reserved.