• servlet CDI


    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和动态组件的概念。

    原博客地址:https://blog.csdn.net/maijunjin/article/details/46120051

  • 相关阅读:
    【转】CUDA5/CentOS6.4
    【转】centos 6.4 samba 安装配置
    【转】Install MATLAB 2013a on CentOS 6.4 x64 with mode silent
    【转】Getting xrdp to work on CentOS 6.4
    【VLFeat】使用matlab版本计算HOG
    Unofficial Windows Binaries for Python Extension Packages
    March 06th, 2018 Week 10th Tuesday
    March 05th, 2018 Week 10th Monday
    March 04th, 2018 Week 10th Sunday
    March 03rd, 2018 Week 9th Saturday
  • 原文地址:https://www.cnblogs.com/tily123/p/11038140.html
Copyright © 2020-2023  润新知