Stateless Session Beans和Request Scoped bean之间有什么区别

Tar*_*rik 7 jsf scope ejb java-ee cdi

我知道无状态会话Bean是指EJB bean,而Request Scoped是指CDI bean(或JSF托管bean),因此我将首先从Java EE Tutoriel中提供它们的两个定义.

无状态会话Bean定义:

无状态会话bean不与客户端保持会话状态.当客户端调用无状态bean的方法时,bean的实例变量可能包含特定于该客户端的状态,但仅限于调用期间.方法完成后,不应保留特定于客户端的状态.

CDI Request Scoped定义:

用户在单个HTTP请求中与Web应用程序的交互.

我从这两个定义中理解的是,无状态会话bean的概念与请求范围概念相同,但我不确定,因为命名"会话"使我感到困惑.所以,我问自己是否是这种情况(相同的概念),也许他们会有类似的命名(使用请求而不是会话).

所以,我的问题是:EJB无状态会话bean和CDI/JSF请求范围bean之间是否有任何概念上的区别?

JB *_*zet 12

有一个很大的不同.

无状态EJB不会在调用之间维护状态.除了依赖于其他bean之外,它通常根本没有状态.它为其他组件提供服务.无状态bean的客户端可以调用它来提供HTTP请求,但是它们也可以在任何HTTP请求之外(批处理,预定作业或其他任何方式)调用它.

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

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