CDI是一组服务,它们一起使用,使开发人员可以轻松地在Web应用程序中使用企业bean和JavaServer Faces技术。CDI设计用于有状态对象,还有许多更广泛的用途,允许开发人员以松散耦合但类型安全的方式集成各种组件的灵活性
CDI 2.0由JSR 365指定.CDI使用的相关规范包括以下内容:
-
JSR 330,Java的依赖注入
-
Managed Beans规范,Java EE平台规范的一个分支(JSR 366)
CDI提供的最基本服务如下。
-
上下文:此服务使您能够将有状态组件的生命周期和交互绑定到定义良好但可扩展的生命周期上下文。
-
依赖注入:此服务使您能够以类型安全的方式将组件注入应用程序,并在部署时选择要注入的特定接口的实现。
此外,CDI还提供以下服务:
-
与表达式语言(EL)集成,允许在JavaServer Faces页面或JavaServer Pages页面中直接使用任何组件
-
装饰注入组件的能力
-
使用类型安全拦截器绑定将拦截器与组件相关联的能力
-
事件通知模型
-
除了Java Servlet规范定义的三个标准范围(请求,会话和应用程序)之外的Web会话范围
-
完整的服务提供程序接口(SPI),允许第三方框架在Java EE环境中完全集成
CDI的一个主要主题是松耦合。CDI执行以下操作:
-
通过定义良好的类型和限定符来解耦服务器和客户端,以便服务器实现可能会有所不同
-
通过分离协作组件的生命周期
-
通过自动生命周期管理使组件具有上下文功能
-
允许有状态组件像服务一样进行交互,纯粹是通过消息传递
-
-
通过事件将消息生成器与消费者完全分离
-
通过Java EE拦截器解耦正交问题
随着松耦合,CDI提供了强大的输入
-
使用基于字符串的名称消除查找连接和相关性,以便编译器检测输入错误
-
允许使用声明性Java注释来指定所有内容,在很大程度上消除了对XML部署描述符的需求,并且可以轻松提供内省代码并在开发时理解依赖结构的工具
CDI重新定义了bean的概念,超出了其在其他Java技术中的使用,例如JavaBeans和Enterprise JavaBeans(EJB)技术。在CDI中,bean是定义应用程序状态或逻辑的上下文对象的源。如果可以根据CDI规范中定义的生命周期上下文模型由容器管理其实例的生命周期,则Java EE组件是bean。
更具体地说,bean具有以下属性:
-
一组(非空)bean类型
-
一组拦截器绑定
-
一个bean实现
bean类型定义了bean的客户端可见类型。几乎任何Java类型都可以是bean的bean类型。
-
bean类型可以是接口,具体类或抽象类,可以声明为final或具有final方法。
-
bean类型可以是具有类型参数和类型变量的参数化类型。
-
bean类型可以是数组类型。仅当元素类型相同时,才认为两种数组类型相同。
-
bean类型可以是原始类型。原始类型被认为与其对应的包装类型相同
java.lang
。 -
bean类型可以是原始类型。