JEE6如何在Observer和Observee之间建立联系(观察者模式)

时间:2010-08-31 08:27:13

标签: java ejb java-ee-6 cdi ejb-3.1

我已经阅读了一些关于JEE6上观察者模式实现的博客文章,有些事情让我感到烦恼......我找不到任何信息,所以我问那里......

我发现了以下例子:

@Stateless
[...]
public class ParisJugService {

   @Inject
   Event event;

   public void helloParis(){
        System.out.println("Hello Paris");
        event.fire("hello Paris invoked!");
   }
}

@Stateless
public class EventReceiver {

    public void onHelloParis(@Observes String message){
        System.out.println("----------- " + message);
    }
}

public class MyEvent {
    String data;
    Date eventTime;
    ....

}

public class EventProducer {

  @Inject @Any Event<MyEvent> event;


  public void doSomething() {
       MyEvent e=new MyEvent();
      e.data="This is a test event";
      e.eventTime=new Date();
      event.fire(e);

  }

}


public class EventConsumer {


    public void afterMyEvent(@Observes MyEvent event) {

        // .. Insert event logic here
    }

}

我无法理解事件使用者和事件生产者之间的联系是如何完成的......

是否通过命名方法的约定? (其中“on”,“after”,“before”......之类的词语将有意义)

是通过比较给定的参数(这里是String和MyEvent)吗?

我无法知道,也看不出它还有什么......

2 个答案:

答案 0 :(得分:6)

容器保存有关其中所有bean的元数据。在启动时,它会将所有观察者方法与他们观察到的事件类型(参数的Class)一起注册。每当触发事件时,都会检查观察者列表中是否有接受适当类型事件的方法。

答案 1 :(得分:2)

事件触发和侦听器之间的链接基于事件类型。

在你的例子中:

public class EventConsumer {

    public void afterMyEvent(@Observes MyEvent event) {
        // .. Insert event logic here
    }

}

此类将接收所有类型为MyEvent的已触发事件,无论它们来自何处。

来源:http://download-llnw.oracle.com/javaee/6/api/javax/enterprise/event/Observes.html