差异:@SessionScoped vs @Stateful和@ApplicationScoped vs @Singleton

Gug*_*upf 12 java singleton ejb stateful stateless

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

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

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

但是,我什么时候应该考虑选择一个EJB或另一个更好?

Arj*_*jms 26

@SessionScoped表示范围,而@Stateful我们现在称之为刻板印象.@Stateful向bean添加一个服务数,其中包括事务行为和钝化.

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

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

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

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

随着EJB 2中的本地bean的引入以及用于远程EJB通信的Swing/Applet客户端的急剧下降,为@Statefulbean 维护的会话的功能变得不那么清楚了.

我认为可以公平地说,@Stateful这些日子并没有那么多使用.对于Web应用程序,HTTP会话几乎总是领先,这意味着使用会话范围和本地@Statelessbean和/或CDI bean来实现业务逻辑.

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

有几分相似的故事@ApplicationScoped@Singleton,虽然没有传统的(@Singleton是一个相当新的东西).@ApplicationScoped它只是一个范围,@Singleton而是bean类型(如果你愿意的话是构造型),它不仅为你提供了应用程序作用域行为,而且还为你提供了事务行为,具有自动锁定功能(可以通过调整@Lock)和热切施工行为(通过@Startup).

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

  • 真棒.你能提供链接或进一步阅读某些术语吗?特别是钝化和刻板印象. (3认同)