无状态会话Bean和请求作用域Bean有什么区别?

9
我知道无状态会话Bean是指EJB Bean,而请求范围是指CDI Bean(或JSF管理的Bean),因此我将从Java EE教程中给出它们的定义。 无状态会话Bean定义:
无状态会话Bean不会维护与客户端的对话状态。当客户端调用状态Bean的方法时,Bean的实例变量可能包含特定于该客户端的状态,但仅在调用期间有效。当方法完成时,不应保留客户端特定状态。
CDI 请求范围定义:
用户在单个HTTP请求中与Web应用程序交互。
从两个定义中,我理解无状态会话Bean的概念与请求范围的概念相同,但是由于命名中的“会话”一词使我感到困惑,因此我并不确定。所以,我问自己,如果情况是这样(相同的概念),也许它们会使用类似的命名(使用“请求”而不是“会话”)。
所以,我的问题是:EJB无状态会话Bean和CDI / JSF请求范围Bean之间是否存在任何概念上的区别?

1
这个重复的问题是否可以接受?https://dev59.com/KWMl5IYBdhLWcg3we283 或者是https://dev59.com/YGox5IYBdhLWcg3w6on0?请注意,在EJB上下文中,“客户端”不是Web浏览器,而是注入了EJB的托管bean。这部分是许多Web开发初学者容易犯错的地方。 - BalusC
1个回答

13

有一个很大的区别。

无状态 EJB 不会在调用之间保持状态。它通常没有状态,除了对其他 bean 的依赖关系。它为其他组件提供服务。无状态 bean 的客户端可以调用它来处理 HTTP 请求,但也可以在任何 HTTP 请求之外调用它(如批处理、定时作业等)。

请求作用域 bean 通常具有状态(否则,它可能是应用程序作用域 bean 或无状态 bean)。并且此状态在 HTTP 请求的持续时间内持续存在。它不能在 HTTP 请求处理代码之外被调用。 请求作用域 bean 的一个很好的例子是当前用户:

  • 请求进入 Servlet 过滤器
  • Servlet 过滤器从请求中提取 cookie,并从数据库中获取与此 cookie 相关的当前用户信息(例如通过调用无状态 bean)
  • Servlet 过滤器将用户信息存储到“currentUser”请求作用域 bean 中
  • 同一请求处理中涉及的其他组件可以从此注入的 currentUser bean 中获取当前用户信息。

感谢您的详细解释。然而,我仍有一个小问题,关于您所说的无状态bean的行为是否类似于没有任何注释的任何类?我理解标记为@stateless还有其他好处,但是行为是否类似于任何未注释的普通类呢? - Tarik
@stateless 表示它将由 EJB 容器管理,这提供了诸如线程安全等池化优势。 - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接