zoukankan      html  css  js  c++  java
  • CDI features

    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!";
        }
    }
    <p>
    

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

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

    达到输出如下结果

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

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

     

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

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

     

    大家已经看见,其实这些招已经在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();
      }
    }
    <p>
    

     

    但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) {
     ...
    }
    <p>
    

    事件模式的引入可以为我们实现业务场景融合提供手段,见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());
    	}
    }
    
    <p>
    

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

     

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

     

    相关资料:

    JavaEE6和CDI

    From JBoss Seam to CDI (JEE6)

    JavaEE 6:EJB3.1新特性

  • 相关阅读:
    php header 跳转 ie问题
    Filter过滤不了Action的问题
    DB2中sql语句占位符问题
    LL(1)文法
    算法分析实验报告词法分析器
    大数据概述
    2016.9.30 编译原理词法分析器
    131有确定性的有穷自动机
    Python基础综合练习
    组合数据类型练习
  • 原文地址:https://www.cnblogs.com/xasdh/p/10720399.html
Copyright © 2011-2022 走看看