Gug*_*upf 12 java singleton ejb stateful stateless
我想知道,以下两者之间的主要区别是什么:
我知道@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侦听器,而@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构造型.