博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CDI Event解析
阅读量:5909 次
发布时间:2019-06-19

本文共 2511 字,大约阅读时间需要 8 分钟。

CDI(Contexts And Dependency Injection)是 6标准中一个规范,将IOC/DI上升到容器级别, 它提供了Java EE平台上服务注入的组件管理核心,简化应该是CDI的目标,让一切都可以被注解被注入。
Contexts概念和我们之前在中 讨论的业务场景不一样,包含有容器技术架构场景的意思,场景包括四种: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}
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年文章就提出自动注入划时代的意义。曾经有一段时间还把这作为jdonframework和Spring 1.x区别吹嘘很长时间,现在都已经是平常事了。
CDI还提供了Producer方法,也就是工厂方法的实现,这样在这个对象被注入之前,你可以定制一些你自己的东西。

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

但Person被注入到其他需要Person的地方之前,createPerson首先被执行,在这个方法中你能做一些注入之前的准备工作。
CDI还提供Events事件注入,使得能够引入中。
事件消息分生产者和消费者,见 一文。消息生产者定义一个事件:
@Inject
private javax.enterprise.event.Event<User> userEvent;
激活一个事件是:
userEvent.fire(user);
消息监听者也就是消费者,只要标注@Observes ,即可处理发出的事件:

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

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

@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提供的基于领域模型的比较类似,但还是有些区别,目前看来,CDI这种事件模式还是组件(userEvent)驱动领域模型(user),不同于JF是领域模型自身发出事件,这两者还是有本质区别,更加突出领域模型作为业务核心的重要位置,而6为了强调其技术架构的重要位置,免不了和业务争夺核心位置,这是我们使用者必须注意的,不能死读标准。
CDI还提供了@Decorator和@Interceptor,这涉及AOP和动态组件的概念。有兴趣可仔细研究。

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

转载于:https://www.cnblogs.com/juepei/p/3857207.html

你可能感兴趣的文章
谷歌大神Jeff Dean:大规模深度学习最新进展 zz
查看>>
javaweb学习总结(八)——HttpServletResponse对象(二)
查看>>
CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能
查看>>
jquery------提供灵活的方法参数
查看>>
Android ContentProvider和getContentResolver
查看>>
深入理解javascript描述元素内容的5个属性
查看>>
Android 知识梳理
查看>>
poj 1331 Multiply
查看>>
第六天
查看>>
解决java.lang.OutOfMemoryError: unable to create new native thread问题
查看>>
POJ - 3294 Life Forms
查看>>
MySQL Merge存储引擎
查看>>
SpringMVC的缓存对静态资源的影响 304 Not Modified
查看>>
wallproxy on ubuntu usage
查看>>
AppCompatActivity实现全屏的问题
查看>>
centos下整合PagerDuty、nagios初探(on-call尝鲜和体验)
查看>>
java笔记----面试题总结(一)【转】
查看>>
Android中EditText显示明文与密文的两种方式
查看>>
CTO 技能图谱skill-map
查看>>
【反射】使用反射来获取注解原数据信息-类信息-方法信息等
查看>>