不同的bean作用域在服务器上如何工作?
我想知道如何在CDI中应用不同的bean作用域( @SessionScoped
@ApplicationScoped
, @SessionScoped
和@RequestScoped
)。 我了解生命周期,但容器中的哪些地方存储了这些信息? 我在JSF bean上使用这些注释。
这些bean如何存储在服务器上以及服务器如何能够知道哪些bean属于谁。
例如,在后台的HTTPSession
对象中存储了一个@SessionScoped
的bean? 具有@ApplicationScoped
bean是否存储在ServletContext
中的映射实例变量中? 如果是这样,那么线程安全性如何? 我想我误解了它,但如果有人能教会我会发生什么,它们被存储在何处(不同的范围),服务器如何知道哪些bean属于谁......就像其他ID一样(不仅会话ID)?
我btw使用Java EE 6所有参考实现。
例如,一个bean在后台的HTTPSession对象中存储了@SessionScoped? 具有@ApplicationScoped的bean是否存储在ServletContext中的映射实例变量中?
对于Web层,这确实是发生了什么。 如果这个bean已经被实例化了,你可以通过手动遍历所有映射中的所有对象来找到它。
虽然@RequestScoped
是一件特别的事情。 在Web层中,这与请求属性映射相对应,但是此范围也适用于对例如远程会话Bean或处理消息的消息驱动的Bean的调用。 在这种情况下,没有http请求,因此没有请求属性映射。 很可能这些存储在“其他地方”,可能是在由代理设置和取消设置的TLS(线程本地存储)中。
如果是这样,那么线程安全性如何?
应用程序和会话范围的bean本身并不是线程安全的。 您必须关注线程安全性,例如使用线程安全的数据结构,synchronized关键字或本质上线程安全的bean类型(如@Stateful注释bean)。
链接地址: http://www.djcxy.com/p/10663.html