7

我想知道在 CDI ( 和 ) 中应用不同的 bean 范围是如何@ApplicationScoped工作@SessionScoped@RequestScoped。我了解生命周期,但是这些存储在容器中的什么位置?我在 JSF bean 上使用这些注释。

这些 bean 是如何存储在服务器上的,服务器如何能够知道哪些 bean 属于谁。

例如是一个bean,它有一个@SessionScoped存储在HTTPSession幕后的对象?bean 是否@ApplicationScoped存储在地图实例变量中ServletContext?如果是这样,那么线程安全性如何。我想我误解了它,但如果有人能告诉我会发生什么,它们的存储位置(不同的范围),服务器如何能够知道哪些 bean 属于谁......就像还有其他 id (不仅是会话 ID)?

顺便说一句,我使用 Java EE 6 所有参考实现。

4

1 回答 1

3

例如,在幕后的 HTTPSession 对象中存储了一个 @SessionScoped 的 bean?带有@ApplicationScoped 的bean 是否存储在ServletContext 的映射实例变量中?

对于 web 层,确实会发生这种情况。如果 bean 已被实例化,您通常可以通过手动迭代所述映射中的所有对象来找到它。

@RequestScoped虽然是一件特别的事情。在 Web 层中,这对应于请求属性映射,但此范围也适用于对远程会话 bean 或处理消息的消息驱动 bean 的调用。在这种情况下,没有 http 请求,因此没有请求属性映射。很可能这些存储在“其他地方”,可能在由 bean 代理设置和取消设置的 TLS(线程本地存储)中。

如果是这样,那么线程安全性如何。

应用程序和会话范围的 bean 本身根本不是线程安全的。必须注意线程安全,例如通过使用线程安全数据结构、同步关键字或本质上是线程安全的 bean 类型(如 @Stateful 注释 bean)。

于 2012-04-13T17:07:12.567 回答