1

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

我发现了以下示例:

@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)吗?

我不知道,也看不出还有什么……

4

2 回答 2

6

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

于 2010-08-31T08:33:49.510 回答
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

于 2010-08-31T08:35:34.163 回答