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

时间:2014-06-08 11:47:00

标签: java singleton ejb stateless stateful

我想知道,主要差异之间是什么:

  1. javax.enterprise.context.SessionScopedjavax.ejb.Stateful
  2. javax.enterprise.context.ApplicationScoped和javax.ejb.Singleton
  3. 我知道 @SessionScoped @Stateful 允许为每个客户端创建一个新实例。我也知道,对于 @ApplicationScoped @Singleton / @Stateless ,它们在客户端之间共享。

    =>但何时应该考虑最好选择一个EJB,还是另一个?

1 个答案:

答案 0 :(得分:26)

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

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

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

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

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

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

我认为可以说@Stateful这些日子根本没用过多少。对于Web应用程序,HTTP会话几乎总是领先,这意味着使用会话范围和本地@Stateless bean和/或CDI bean来实现业务逻辑。

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

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

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