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

2023-11-24

我想知道,有哪些主要差异之间 :

  1. javax.enterprise.context.SessionScoped and javax.ejb.Stateful
  2. javax.enterprise.context.ApplicationScoped 和 javax.ejb.Singleton

我知道一个@SessionScoped and a @有状态允许为每个客户端创建一个新实例。我也知道对于@ApplicationScoped and @单例/@无状态它们在客户之间共享。

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


@SessionScoped表示一个范围,同时@Stateful在某种程度上我们现在称之为刻板印象。@Stateful向 bean 添加多项服务,其中包括事务行为和钝化。

中央至@Stateful然而,它的会话行为确实与会话范围重叠。

不同之处在于会话范围与 HTTP 会话相关联,而@Stateful是一个开放式的用户管理会话,其生命周期由具有对 Bean 代理引用的客户端管理。

@Stateful远程 bean 最初是 Servlet 的二进制 (RMI) 计数器部分。 Servlet 监听来自浏览器的远程 HTTP 请求,@Stateful远程 bean 侦听来自 Applet(以及后来的 Swing 客户端)的远程 RMI 请求。

不幸的是,两者之间存在许多不一致之处。 Servlet 只是一个 HTTP 监听器,而@Statefulbeans 自动引入了许多其他功能。 Servlet 还与所有其他 Servlet 共享会话,并且还与战争中的所有其他 Servlet 共享 Java EE 组件名称空间,同时与@StatefulEJB 每个单独的 bean 都有自己的会话和组件名称空间。

随着 EJB 2 中本地 Bean 的引入以及用于远程 EJB 通信的 Swing/Applet 客户端的急剧减少,为@Statefulbean 变得不太清晰了。

我认为这样说是公平的@Stateful现在已经不那么常用了。对于 Web 应用程序,HTTP 会话几乎总是领先,这意味着使用会话范围和本地@Stateless用于业务逻辑的 bean 和/或 CDI bean。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

差异:@SessionScoped 与 @Stateful 和 @ApplicationScoped 与 @Singleton [关闭] 的相关文章

随机推荐