CDI Event解析

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;

@Namedpublic 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 : [email protected]

也就是说,@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@SessionScopedpublic 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解析

时间: 2024-10-07 23:11:20

CDI Event解析的相关文章

QT5的post Event解析

大家都知道,QT的事件机制,查了好多网上的帖子,分析的不够到位,今天给大家分享下,我的分析,请高手指正:都知道post Event通过    QScopedPointer<QEvent> eventDeleter(event);//增加到事件队列    data->postEventList.addEvent(QPostEvent(receiver, event, priority));    eventDeleter.take();    event->posted = true

C#事件(event)解析

事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要,其实C#事件就是基于windows消息处理机制的,只是封装的更好,让开发者无须知道底层的消息处理机制,就可以开发出强大的基于事件的应用程序来. 先来看看事件编程有哪些好处. 在以往我们编写这类程序中,往往采用等待机制,为了等待某件事情的发生,需要不断地检测某些判断变量,而引入事件编程后,大大简化了这种过程: - 使用事件,可以很方

CDI(Weld)高级&lt;4&gt; Event(事件) (转)

目录[-] 1. Event payload(事件的有效载入) 2. Event observers(event的观察者) 3. Event producers(event生产者) 4.AnnotationLiteral动态注入对应事件 5.Conditional observer methods 6.Event qualifiers with members 7.Multiple event qualifiers 8.事务性处理的transactional observers DEMO A:

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

一.EL(SPEL) 1.概述: EL是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 , 取得对象属性的值,或执行简单的运算或判断操作.EL在得到某个数据时,会自动进行数据类型的转换. 使用EL表达式输出数据时,如果有则输出数据,如果为null则什么也不输出. 2.语法: EL表达式总是放在{}中,而且前边有一个\(作为前缀:\){} 获取对象的属性值可以直接通过"对象.属性名":${user.name}; 注意:这里的属性名是get和set方法对应的属性值,并不

C#学习日记24----事件(event)

事件为类和类的实例提供了向外界发送通知的能力,实现了对象与对象之间的通信,如果定义了一个事件成员,表示该类型具有 1.能够在事件中注册方法 (+=操作符实现). 2.能够在事件中注销方法(-=操作符实现). 3.当事件被触发时注册的方法会被通知(事件内部维护了一个注册方法列表).委托(Delegate)是事件(event)的载体,要定义事件就的要有委托.  有关委托的内容请点击 委托(De... www.mafengwo.cn/event/event.php?iid=4971258www.maf

Mysql binlog 详细解读

Mysql的binlog主要用于逻辑同步以及二阶段提交的安全性保证,而在平时的使用中我们DBA也会从中获取一些重要的信息,比如说主从同步延迟了我们可以通过binlog查看当前事务执行的内容,比如可以利用binlog+备份的方式进行误删回滚,开源工具中也有很多利用binlog做闪回.同步数据到缓存中的方案,异地多活的高可用框架完成后有点空闲就对binlog的组成深入了解了下(基于mysql5.7版本,binlog版本v4),mysql 5.0之后binlog都采用的v4版本,结构如下分为heade

改善JavaScript程序的188个建议

前言第1章 JavaScript语言基础建议1:警惕Unicode乱码建议2:正确辨析JavaScript句法中的词.句和段建议3:少全局变量污染建议4:注意JavaScript数据类型的特殊性 建议5:防止JavaScript自动插入分号建议6:正确处理JavaScript特殊值建议7:小心保留字的误用建议8:谨慎使用运算符建议9:不要信任hasOwnProperty建议:谨记对象空特性建议11:慎重使用伪数组建议12:避免使用with建议13:养成优化表达式的思维方式建议14:不要滥用eva

java JAXB + STAX(是一种针对XML的流式拉分析API)读取xml

<dependency> <groupId>stax</groupId> <artifactId>stax-api</artifactId> <version>1.0.1</version> </dependency> 使用XMLStreamReader和XMLEventReader读取XML文件 1 <?xml version="1.0" encoding="UTF-8&q

《编写高质量代码:改善JavaScript程序的188个建议》学习小记(一)

作者介绍: 成林,资深Web前端工程师,从事Web前端工作多年,精通CSS.HTML.JavaScript.jQuery和Ajax等Web前端技术,在实践中积累了大量的经验.推崇Web技术标准,曾经在多所高等院校和一些线下技术沙龙主讲Web标准和规范相关的课程,曾经还参与过W3C组织的标准化文档的中文编译工作.近几年来,集中精力研究和实践CSS3和 HTML 5前沿技术,在国内是该领域的先驱者之一. 其中书的目录分类为以下几部分: 第1章 JavaScript语言基础 第2章 字符串.正则表达式