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

2022-09-04 06:42:27

我想知道,主要区别是什么:

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

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

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


答案 1

@SessionScoped表示一个范围,而在某种程度上,我们现在称之为刻板印象。 向一个 Bean 中添加一个数字 a 服务,其中事务行为和钝化。@Stateful@Stateful

然而,核心是它的会话行为,它确实与会话范围重叠。@Stateful

不同之处在于,会话作用域与 HTTP 会话相关联,而会话作用域是开放式用户托管会话,其生存期由引用 Bean 代理的客户端管理。@Stateful

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

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

随着 EJB 2 中本地 Bean 的引入以及用于远程 EJB 通信的 Swing/Applet 客户端的急剧减少,为 Bean 维护的会话功能变得不那么清晰了。@Stateful

我认为公平地说,现在根本没有那么多使用。对于 Web 应用程序,HTTP 会话几乎总是领先的,这意味着将会话作用域和本地 Bean 和/或 CDI Bean 用于业务逻辑。@Stateful@Stateless

在某些情况下,需要Bean来自然地支持来自JPA的扩展持久性上下文和它们的钝化功能(Servlet没有标准化的钝化机制)。请注意,和(或许多其他作用域)可以组合使用。将它们组合在一起的好处是,用户代码不再需要管理生存期,但容器可以管理它。@Stateful@Stateful@SessionScoped

有一个类似的故事和,虽然没有遗产(是一个相当新的东西)。 只是一个作用域,而它是一个 bean 类型(如果你愿意,可以构造型),它不仅为你提供应用程序作用域的行为,而且还为你再次提供事务行为,自动锁定(可以通过)和预先构造行为(通过 )。@ApplicationScoped@Singleton@Singleton@ApplicationScoped@Singleton@Lock@Startup

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


答案 2

推荐