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类型可以是原始类型。

CDI的分析的更多相关文章

  1. Servlet CDI 例子分析

    @WebServlet("/cdiservlet") //以@WebServlet注释开头,注释指定相对于上下文根的URL模式,即在根目录下使用/cdiservlet来访问 pub ...

  2. JBoss 系列七十:一个简单的 CDI Web 应用

    概述 本文通过一个简单的 CDI Web 应用演示dependency injection, scope, qualifiers 以及EL整合.应用部署完成后我们可以通过http://localhos ...

  3. CDI services--Event(事件)

    Cdi中的event事件,是整个CDI的精华所在之一.其有点类似设计模式中的观察者模式.但也有不同的地方.如下3点: 不仅是生产者(producers)从观察者(observers)解耦.观察者也从生 ...

  4. CDI(Weld)高级<4> Event(事件) (转)

    目录[-] 1. Event payload(事件的有效载入) 2. Event observers(event的观察者) 3. Event producers(event生产者) 4.Annotat ...

  5. 20179223《Linux内核原理与分析》第五周学习笔记

    视频内容知识学习 一.用户态.内核态和中断 1.内核态:处于高的执行级别下,代码可以执行特权指令,访问任意的物理地址,这时的CPU就对应内核态 2.用户态:处于低的执行级别下,代码只能在级别允许的特定 ...

  6. SQL优化(三)—— 索引、explain分析

    SQL优化(三)—— 索引.explain分析   一.什么是索引 索引是一种排好序的快速查找的数据结构,它帮助数据库高效的查询数据 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据 ...

  7. Quantexa CDI(场景决策智能)Syneo平台介绍

    Quantexa 大数据服务提供商, 使用实体解析, 关系分析和人工智能技术帮助客户进行数据处理和预防金融犯罪. 企业概览 2016年成立, 当前规模500人 服务特色是场景决策智能CDI(conte ...

  8. alias导致virtualenv异常的分析和解法

    title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...

  9. 火焰图分析openresty性能瓶颈

    注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...

随机推荐

  1. HTML基础【2】:基础标签

    H系列标签(H1 ~ H6) 作用: 用于给文本添加标题语义 格式: <h1>xxxxxx</h1> 注意点 H 标签是用来给文本添加标题语义的,而不是用来修改文本的样式的 H ...

  2. 【IOS】#import和#include有什么区别,@class呢,#import<>跟#import ""有什么区别?

    1.#import是object-c导入头文件的关键字,#include是C/c++导入头文件的关键字,使用#import导入头文件会自动只导入一次,不会重复导入. 2.@class是告诉编译器某个类 ...

  3. [大数据从入门到放弃系列教程]第一个spark分析程序

    [大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...

  4. Centos 6.8安装ideaIU-2017.2.6-no-jdk

    参考资料: (一)https://www.jetbrains.com/help/idea/2017.2/intellij-idea-help.pdf  (链接: https://pan.baidu.c ...

  5. Executors创建线程池的几种方式以及使用

    Java通过Executors提供四种线程池,分别为:   1.newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.   ...

  6. 一招破解 Java 集合类面试题

    今日招式:Java集合类面试题 Java集合类绝对是我们的老朋友了,Java技术江湖里,谁人不知,谁人不晓,它的使用率非常高,使用难度却也不大,这也导致了很多人对它不屑一顾,殊不知其中却暗藏玄机,今天 ...

  7. Resnet-34框架

    import torch import torch.nn as nn import torch.nn.functional as F class ResidualBlock(nn.Module): ' ...

  8. Spring boot连接MongoDB集群

    主要问题是:MongoDB集群分为复制集(replicaSet)与分片集(shardingSet),那么如何去连接这两种集群: 参考官方文档,我使用了最通用的方法:通过构造connection str ...

  9. 【其他】【http】【1】HTTP状态码

    一些常见的状态码: 200 - 服务器成功返回网页 400 - 错误请求 404 - 请求的网页不存在 500 - 服务器内部错误 503 - 服务器超时 状态码大全: 1xx(临时响应)表示临时响应 ...

  10. pandas数据结构之Dataframe

    Dataframe DataFrame是一个[表格型]的数据结构,可以看做是[由Series组成的字典](多个series共用同一个索引).DataFrame由按一定顺序排列的多列数据组成.设计初衷是 ...