我想知道,以下之间的主要区别是什么:
我知道 @SessionScoped 和 @Stateful 允许为每个客户端创建一个新实例。我还知道,对于 @ApplicationScoped 和 @Singleton / @Stateless,它们是在客户端之间共享的。
=> 但是我什么时候应该考虑选择EJB还是其他更好?
@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 构造型,其中包含这些分解的注释。