不同的bean作用域如何在服务器上运行?

Luc*_*uke 7 java-ee cdi

我想知道如何在CDI(@ApplicationScoped,@SessionScoped@RequestScoped)中应用不同的bean范围.我理解生命周期,但容器中的这些存储在哪里?我在JSF bean上使用这些注释.

这些bean如何存储在服务器上以及服务器如何知道哪些bean属于谁.

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

我正在使用Java EE 6所有参考实现.

Arj*_*jms 3

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

对于网络层来说,确实是这样。如果 bean 已被实例化,您通常可以通过手动迭代所述映射中的所有对象来找到它。

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

如果是这样,那么线程安全呢?

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