Stateless Session Bean 和 Request Scoped bean 有什么区别

What is the difference between Stateless Session Beans and Request Scoped beans

我知道 Stateless Session Beans 指的是 EJB bean,而 Request Scoped 指的是 CDI bean(或 JSF 管理的 bean),所以我将从给出它们的两个定义开始Java EE Tutoriel.

Stateless Session Beans定义:

A stateless session bean does not maintain a conversational state with the client. When a client invokes the methods of a stateless bean, the bean’s instance variables may contain a state specific to that client but only for the duration of the invocation. When the method is finished, the client-specific state should not be retained.

CDI Request Scoped 定义:

A user’s interaction with a web application in a single HTTP request.

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

所以,我的问题是:EJB 无状态会话 bean 和 CDI/JSF 请求作用域 bean 在概念上有区别吗?

区别很大。

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

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

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