CDI(Contexts And Dependency Injection)是JavaEE 6标准中一个规范,将依赖注入IOC/DI上升到容器级别, 它提供了Java EE平台上服务注入的组件管理核心,简化应该是CDI的目标,让一切都可以被注解被注入。

Contexts概念和我们之前在DCI架构
讨论的业务场景不一样,包含有容器技术架构场景的意思,场景包括四种:request (event), session, application,
page,而SEAM框架拓展了两个 conversation 和 business process context。

CDI对JSF和EJB模型使用都产生比较大的变化,比如对JSF影响,下面是JSF的一个用来显示的Bean:

import javax.inject.Named;

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

使用了@Named来标注,那么在jsp页面中就可以写入标签:

       Message is : #{messageServerBean.message}<br>
Message Server Bean is : #{messageServerBean}

达到输出如下结果

Message is : Hello World!
Message Server Bean is : eedemo.MessageServerBean@xxxxxxx

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

CDI另外一个特点就是将对象在容器中场景生命周期标注出来,如下:

@Named("itemProcessor")
@RequestScoped //表示生命周期是request,每次request请求结束,生命就终止,也可以有Session或 Application等
public class ItemProcessor { @Inject
private ItemDao itemDao; //表示ItemDao需要被注入 ...
}

大家已经看见,其实这些招已经在Spring或我们的Jdonframework中普遍使用,实际是依赖注入的升级版。是一种自动配对auto-wired的注入,不是Spring 1.x中那种手工配置依赖的那种。我在05年文章Ioc容器的革命性优点就提出自动注入划时代的意义。曾经有一段时间还把这作为jdonframework和Spring 1.x区别吹嘘很长时间,现在都已经是平常事了。

CDI还提供了Producer方法,也就是工厂方法的实现,这样在这个对象被注入之前,你可以定制一些你自己的东西。

public class PersonFactory {

  @Produces 
@RequestScoped
public Person createPerson() {
return new Person();
}
}

但Person被注入到其他需要Person的地方之前,createPerson首先被执行,在这个方法中你能做一些注入之前的准备工作。

CDI还提供Events事件注入,使得异步事件模式能够引入JavaEE中。

事件消息分生产者和消费者,见 Event-Listerner事件监听模式一文。消息生产者定义一个事件:
@Inject
private javax.enterprise.event.Event<User> userEvent;

激活一个事件是:
userEvent.fire(user);

消息监听者也就是消费者,只要标注@Observes ,即可处理发出的事件:

public void observeUserEvent(@Observes User user) {
...
}

事件模式的引入可以为我们实现业务场景融合提供手段,见ZK的CDI应用

@Named
@SessionScoped
public class HelloWorld extends GenericComposer implements Serializable { @Inject @ComponentId("guestName") Textbox guestName;
@Inject @ComponentId("sayHelloBtn") Button sayHelloBtn;
@Inject @ComponentId("helloWindow") Window helloWindow; public void sayHello(@Observes @Events("sayHelloBtn.onClick") MouseEvent evt) {
helloWindow.setTitle("Hello " + guestName.getValue());
}
}

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

CDI还提供了@Decorator和@Interceptor,这涉及AOP和动态组件的概念。有兴趣可仔细研究。

转自:http://www.jdon.com/38322

CDI Event解析的更多相关文章

  1. C#事件(event)解析

    事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要,其实C#事件就是基于window ...

  2. C#事件(event)解析委托

    namespace Vczx.ProCSharp.Event { /// <summary> /// 类EatEventArgs 必须继承自类EventArgs,用来引发事件时封装数据 / ...

  3. QT5的post Event解析

    大家都知道,QT的事件机制,查了好多网上的帖子,分析的不够到位,今天给大家分享下,我的分析,请高手指正:都知道post Event通过    QScopedPointer<QEvent> ...

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

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

  5. 深入解析MySQL replication协议

    Why 最开始的时候,go-mysql只是简单的抽象mixer的代码,提供一个基本的mysql driver以及proxy framework,但做到后面,笔者突然觉得,既然研究了这么久mysql c ...

  6. CDI服务

    前言 CDI(Contexts and Dependency Injection 上下文依赖注入),是JAVA官方提供的依赖注入实现,可用于Dynamic Web Module中,将依赖注入IOC/D ...

  7. CDI services--Event(事件)

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

  8. CDI Features(EL(SPEL),Decorator,Interceptor,Producer)

    一.EL(SPEL) EL 1.概述:EL是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作.EL在得到某个数据时,会自动进行数据类型 ...

  9. MySQL Binlog解析

    https://yq.aliyun.com/articles/238364?spm=5176.8067842.tagmain.52.73PjU3 摘要: 概述 MySQL的安装可以参考:Linux(C ...

随机推荐

  1. MySQL 高性能存储引擎:TokuDB初探

    在安装MariaDB的时候了解到代替InnoDB的TokuDB,看简介非常的棒,这里对ToduDB做一个初步的整理,使用后再做更多的分享. 什么是TokuDB? 在MySQL最流行的支持全事务的引擎为 ...

  2. HDU 4497 GCD and LCM(数论+容斥原理)

    GCD and LCM Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total ...

  3. 25个必须记住的SSH命令

      OpenSSH是SSH连接工具的免费版本.telnet,rlogin和ftp用户可能还没意识到他们在互联网上传输的密码是未加密的,但SSH 是加密的,OpenSSH加密所有通信(包括密码),有效消 ...

  4. django单表操作,增、删、改、查

    一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...

  5. 最全互联网Linux工作规划!

    首先祝贺你选择学习Linux,你可能即将踏上Linux的工作之旅,出发之前,让我带你来看一看关于Linux和Linux运维的一切. Linux因其高效率.易于裁剪.应用广等优势,成为了当今中高端服务器 ...

  6. HTTP 返回码 400

    400(错误请求)服务器不理解请求的语法 404表示页面不存在 返回500表示内部服务出错, 返回301表示资源永久性跳转 HTTP 500 – 内部服务器错误 HTTP 500.100 – 内部服务 ...

  7. nginx tcp负载均衡配置

    1. nginx从1.9.0后引入模块ngx_stream_core_module,模块是没有编译的,需要用到编译需添加--with-stream配置参数 2. 在 nginx.conf 文件中, 与 ...

  8. 为什么需要maven,maven能解决什么问题 ,maven是什么

  9. 获取select值及判断是否是数字

    代码片段 <div class="container-fluid"> <div class="row"> <div class=& ...

  10. CWinApp: The Application Class

    [CWinApp: The Application Class]  An application built on the framework must have one and only one o ...