1、CDI是什么?目的和作用是什么?

概念(是什么):是JavaEE 6标准中一个规范,

   作用(干什么): 它提供了Java EE平台上服务注入的组件管理核心,简化应该是CDI的目标,让一切都可以被注解被注入。


和之前接触过的IOC/ID 有什么不同

(1)、将依赖注入IOC/DI上升到容器级别

(2)概念和我们之前在DCI架构中讨论的业务场景不一样,

包含有容器技术架构场景的意思,场景包括四种:

1、request (event),

2、session,
3、application,
4、page,
而SEAM框架拓展了两个 5、conversation 和 6、business process context 。 

简单的示例说明:  CDI对JSF和EJB模型使用都产生比较大的变化,比如对JSF影响,下面是JSF的一个用来显示的Bean:
 
import javax.inject.Named;

@Named
public class MessageServerBean { public String getMessage() {
return "Hello World!";
}
}

  

使用了@Named来标注
也就是说,@Named标注实际相当于给MessageServerBean取名eedemo.MessageServerBean(当然你也可以显式写一个名称),你就可以直接以messageServerBean对其getter方法进行输出了。
 
注释: 当然 eedemo.MessageServerBean 是一个默认的隐式名称 
 

Java EE CDI 主要使用@Inject注解来实现依赖注入,把受管理的bean注入到由容器管理的其它资源中去。

CDI还提供了@Decorator和@Interceptor,这涉及AOP和动态组件的概念。此处不做深入描述

@Named("itemProcessor")
@RequestScoped //表示生命周期是request,每次request请求结束,生命就终止,也可以有Session或 Application等
public class ItemProcessor { @Inject
private ItemDao itemDao; //表示ItemDao(业务类)需要被注入
  
//@ANY 修饰符
//为了提供完全松耦合的应用,我们通常把接口注入到受管理的资源中。
//当我们有多个实现了给定接口的bean时该怎么办呢?
//我们可以同时使用@Any修饰符和CDI的Instance接口,来把所有该接口的实现bean都注入进一个受管理的bean中:
@Inject
public void listServiceImplementations(
@Any Instance<Service> serviceList) { for(Service service : serviceList){
System.out.println(service.getClass().getCanonicalName());
} }
...
}

  

@RequestScoped //表示生命周期是request,每次request请求结束,生命就终止,也可以有Session或 Application等
 

CDI这种事件模式还是组件(userEvent)驱动领域模型(user),不同于JF是领域模型自身发出事件,这两者还是有本质区别,更加突出领域模型作为业务核心的重要位置,而JavaEE6为了强调其技术架构的重要位置,免不了和业务争夺核心位置,这是我们使用者必须注意的,不能死读标准。

生产者方法的参数也可以经由CDI容器进行注入。请查看Java EE CDI Producer methods tutorial.

CDI代理:

CDI创建代理是通过继承原来bean的类,并重写所有非私有方法。一个简单的典型的代理的例子可以像下面这样:

当一个Session范围的bean 被注入 application 范围作用域由于 application 范围内的 bean 是共享到整个项目中的  如果多个客户

同时访问这个 application里面被注入的这个 session 范围内的 bean 的话很有可能会造成  A用户访问的应该是 B用户 Session 范围bean

的内容 、为了处理这种问题 CDI 创造了代理 并把代理注进注入点,由代理负责对应被注入的bean 的调用

如下场景代码简单示例为:

@SessionScoped
public class Service { public void doWork() {
System.out.println("Working...");
} } // 在application范围内注入了 session范围内的bean 就造成了我上述的情况
@ApplicationScoped
public class SomeBean { @Inject
private Service service; // 这个注入是存在问题的 public void test(){
service.doWork();
} }

  

CDI 代理 示例

//交给CDI进行代理 并重写所有service 非私有方法 然后以避免此问题发生
public class  Service$Proxy$_$$_WeldClientProxy  extends Service { 

      @Override
public void doWork() {
Service instance = // ... resolve bean instance
instance.doWork();
} }

 

由于CDI代理通过继承bean的类来创建,所以当我们讨论非依赖性bean范围的时候,你应当明白CDI有如下一些限制:

CDI 范围限制 请查看  :   javaEE CDI  bean scopes

1、CDI不能注入原始类型

2、bean 必须有一个非私有的默认构造器

3、bean的类型不能用final 修饰  并且 bean中能有final 方法

CDI的概念理解的更多相关文章

  1. 大数据核心知识点:Hbase、Spark、Hive、MapReduce概念理解,特点及机制

    今天,上海尚学堂大数据培训班毕业的一位学生去参加易普软件公司面试,应聘的职位是大数据开发.面试官问了他10个问题,主要集中在Hbase.Spark.Hive和MapReduce上,基础概念.特点.应用 ...

  2. SpringIOC的概念理解、构造器注入、setter注入、p命名空间注入、IOC容器介绍与比较

    1.IOC概念理解 IOC(Inversion of Control)即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...

  3. Kubernetes重要概念理解

    Kubernetes重要概念理解 kubernetes是目前最主流的容器编排工具,是下一代分布式架构的王者.2018年的kubernetes第一个版本1.10已经发布.下面整理一下,kubernete ...

  4. SNF快速开发平台2019-角色、权限、账户的概念理解-非常全的理论讲解权限控制

    组织模型   资源模型  操作模型 谁能够执行哪些操作    执行资源的范围 资源概念资源就是想要的到的最终物质,我们可以给每一个资源定义一个权限,也可以给某一类资源定义一个权限 权限概念权限是对资源 ...

  5. elasticsearch基本概念理解+elasticsearch 的shards unassigned处理方法 -- 最佳运维实践 - 集群规划

    1.es与MySQL的概念对比 2.概念理解 2.1 Index : 一个索引即是文档的集合 2.2 Document : 一个文档即是一个可被索引的基础单元信息,一条记录: 2.3 Replicas ...

  6. fragment概念理解

    fragment概念理解知识,fragment概念理解图片 fragment概念理解内容,fragment概念理介绍,fragment概念理正文 Fragment是Android honeycomb ...

  7. ubuntn系统下将文件拷贝到优盘中及挂载概念理解

    参考资料:http://jingyan.baidu.com/article/7082dc1c76f178e40a89bdd3.html: http://bbs.csdn.net/topics/3801 ...

  8. Ceph 概念理解

    简介 Ceph是一个可靠地.自动重均衡.自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储.块设备存储和文件系统服务. 在虚拟化领域里,比较常用到的是Ceph的块设备存储, ...

  9. IdentityServer4 - V4 概念理解及认证授权过程

    概念理解 Scope 范围,它的定义比较宽泛,可大可小.大到可把多个包含相同Scope的站点或服务形成一个虚拟的组,也可以是站点或服务的子级:小到身份所需要包含的信息,以精确出哪种身份. Client ...

  10. JavaScript的作用域和块级作用域概念理解

    作用域 作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期.说到这里我们需要理解两个概念:块级作用域与函数作用域. 函数作用域 这个应该好理解,函数作用域就是说定义在 ...

随机推荐

  1. [Java SE/Junit] 基于Java的单元测试框架Mockito

    Mockito 是一个模拟测试框架,主要功能是在单元测试中模拟类/对象的行为. 1 为什么要使用Mockito? Mock可以理解为创建一个虚假的对象,或者说模拟出一个对象.在测试环境中用来替换掉真实 ...

  2. 系统建模之UML状态图[转载]

    1 状态图的简介(Instrduction) 状态图(Statechart Diagram)主要用于描述一个对象在其生存期间的动态行为,表现为一个对象所经历的状态序列,引起状态转移的事件(Event) ...

  3. Semantic Kernel 入门系列:🔥Kernel 内核和🧂Skills 技能

    理解了LLM的作用之后,如何才能构造出与LLM相结合的应用程序呢? 首先我们需要把LLM AI的能力和原生代码的能力区分开来,在Semantic Kernel(以下简称SK),LLM的能力称为 sem ...

  4. python过滤列表元素

    li = [1, 2, 3, 4, 5, 6] def fun(item, num): if item == num: return 1 else: return 0 def fun1(item, n ...

  5. XXL-JOB定时任务框架(Oracle定制版)

    特点 xxl-job是一个轻量级.易扩展的分布式任务调度平台,能够快速开发和简单学习.开放源代码并被多家公司线上产品使用,开箱即用.尽管其确实非常好用,但我在工作中使用的是Oracle数据库,因为xx ...

  6. HTML+CSS+JavaScript作业篇

    一.作业题大全 1.1.HTML5表单验证 代码: <!DOCTYPE html> <html lang="en"> <head> <me ...

  7. javasec(五)URLDNS反序列化分析

    这篇文章介绍 URLDNS 就是ysoserial中⼀个利⽤链的名字,但准确来说,这个其实不能称作"利⽤链".因为其参数不是⼀个可以"利⽤"的命令,⽽仅为⼀个U ...

  8. xcode历史版本下载

    一.背景 较早之前做过一个项目,当时使用swift 3.x开发. 项目结束后就没再有新需求与更新. 但最近呢需要对项目的某些功能进行调整,项目又重新被拾了起来. 我们知道现在的swift 版本已经到了 ...

  9. YOLO2论文中文版

    文章目录 YOLO9000中文版 摘要 1. 引言 2. 更好 3. 更快 4. 更强 5. 结论 参考文献 YOLO9000中文版 摘要 我们引入了一个先进的实时目标检测系统YOLO9000,可以检 ...

  10. JSP 的本质原理解析:"编写的时候是JSP,心里想解读的是 java 源码"

    JSP 的本质原理解析:"编写的时候是JSP,心里想解读的是 java 源码" @ 目录 JSP 的本质原理解析:"编写的时候是JSP,心里想解读的是 java 源码&q ...