我想知道,主要差异之间是什么:
我知道 @SessionScoped 和 @Stateful 允许为每个客户端创建一个新实例。我也知道,对于 @ApplicationScoped 和 @Singleton / @Stateless ,它们在客户端之间共享。
=>但何时应该考虑最好选择一个EJB,还是另一个?
答案 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刻板印象。