我已经阅读了一些关于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)吗?
我无法知道,也看不出它还有什么......
答案 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