java ee cdi
Java EE平台的上下文和依赖注入(CDI)是一项功能,有助于将Java EE平台的Web层和事务层绑定在一起。 CDI是一组服务,可以一起使用,使开发人员可以轻松地在Web应用程序中使用企业bean和JavaServer Faces技术。
在CDI中,bean是定义应用程序状态和/或逻辑的上下文对象的源。 如果容器可以根据CDI规范中定义的生命周期上下文模型来管理其实例的生命周期,则Java EE组件就是Bean。
托管bean是由Java类(称为其bean类)实现的。 如果任何其他Java EE技术规范(例如JavaServer Faces技术规范)将顶级Java类定义为托管bean,则该顶级Java类为托管bean。
当我们需要使用在Web应用程序中注入另一个bean类的bean时,该bean需要能够在用户与应用程序交互期间保持状态。 定义此状态的方法是给Bean一个范围。 范围为对象提供了明确定义的生命周期上下文。 有作用域的对象可以在需要时自动创建,并在创建对象的上下文结束时自动销毁。 而且,其状态由在相同上下文中执行的所有客户端自动共享。
当我们创建作为托管bean的Java EE组件时,它将成为有作用域的对象,该对象存在于定义良好的生命周期上下文中。 下表列出了CDI提供的范围:
1.请求– @RequestScoped
此范围描述了单个HTTP请求中用户与Web应用程序的交互。 @RequestScoped
注释的bean的实例具有HTTP请求生命周期。
2.会话– @SessionScoped
此范围表示用户跨多个HTTP请求与Web应用程序的交互。
3.应用程序– @ApplicationScoped
在这种情况下,状态在所有用户与Web应用程序的交互中共享。 容器为所有客户端请求提供了@ApplicationScoped
注释的Bean的相同实例。
4.对话– @ConversationScoped
此范围描述了用户与JavaServer Faces应用程序之间的交互,该交互在显式的开发人员控制的边界内进行,该边界将范围扩展到JavaServer Faces生命周期的多次调用。 所有长时间运行的对话都限于特定的HTTP Servlet会话,并且可能不会跨越会话边界。
注意,使用ConversationScoped
Bean,我们可以从ViewScoped
JSF Bean中获得所需的相同功能。 此外,借助ConversationScoped
Bean,我们可以在不同的页面请求之间维护相同的对话(或状态)。 但是,当我们不进行对话时,托管Bean将保持活动状态直到超时。
需要注意的是,使用会话或会话范围的bean必须可序列化。 这是因为容器会不时地钝化HTTP会话,因此当再次激活该会话时,必须检索Bean的状态。
5. Singleton – @Singleton伪作用域
这是一个伪作用域。 它定义了一次实例化bean。 当将CDI托管bean注入另一个bean中时,CDI容器将使用代理。 代理是处理对bean的调用的代理。 但是,@ @Singleton
注释的bean没有代理对象。 客户端直接引用单例实例。 那么,当客户端被序列化时会发生什么? 我们必须确保单例bean保持单例。 为此,有几种方法,例如,让单例bean实现writeResolve()
和readReplace()
(由Java序列化规范定义),确保客户端仅保留对单例bean的临时引用,或者给出客户端对Instance<X>
类型的引用,其中X
是单例bean的bean类型。
6. Dependent – @Dependent伪作用域
该伪作用域意味着存在一个对象,该对象恰好服务于一个客户端(bean),并且具有与该客户端(bean)相同的生命周期。 这是未显式声明作用域类型的bean的默认作用域。 从属bean的实例永远不会在不同客户端或不同注入点之间共享。 严格来说,它是某些其他对象的从属对象。 它在创建属于它的对象时被实例化,而在它属于它的对象被破坏时被实例化。
除@Dependent
外,所有预定义范围都是上下文范围。 CDI将上下文范围的bean放置在其生命周期由Java EE规范定义的上下文中。 例如,会话上下文及其bean在HTTP会话的生存期内存在。 对bean的注入引用是上下文相关的。 引用始终适用于与进行引用的线程的上下文相关联的Bean。 CDI容器确保在为这些对象指定的范围所确定的正确时间创建和注入对象。
您还可以定义和实现自定义范围。 实施和扩展CDI规范的人员可以使用它们。
这是CDI提供的所有bean范围的教程。 参考文献:
- Seam框架参考文档
- Java EE 6教程
翻译自: https://www.javacodegeeks.com/2013/04/java-ee-cdi-bean-scopes.html
java ee cdi