尽管Java的简单,界面驱动的事件通知框架早在寒武纪之前就已经存在(例如java.beans.PropertyChangeSupport),但是使用注释驱动的事件通知的框架正变得越来越流行。
有关示例,请参见JBossCache 2.2。侦听器类的侦听器方法带有注释,而不是遵循严格的接口。因为您不必编写您不感兴趣的侦听器回调的空实现(而且是的,我知道侦听器适配器超类),所以这更容易编程和易于阅读。
这是来自JBossCache文档的示例:
@CacheListener
public class MyListener {
@CacheStarted
@CacheStopped
public void cacheStartStopEvent(Event e) {
switch (e.getType()) {
case Event.Type.CACHE_STARTED:
System.out.println("Cache has started");
break;
case Event.Type.CACHE_STOPPED:
System.out.println("Cache has stopped");
break;
}
}
@NodeCreated
@NodeRemoved
@NodeVisited
@NodeModified
@NodeMoved
public void logNodeEvent(NodeEvent ne) {
log("An event on node " + ne.getFqn() + " has occured");
}
}
这样做的问题是,由于注释和反射的性质,它更多地是涉及编写框架来支持这种事情的过程。
因此,在我开始编写通用框架之前,我希望有人已经做到了。有人遇到过这样的事情吗?
最佳答案
您现在可以使用EventBus完成此操作。
以下示例来自EventBus Getting Started guide。根据发布的事件进行更新的状态栏,无需将状态栏控件/小部件注册为发布者的侦听器。没有EventBus,状态栏将需要添加为许多类的侦听器。状态栏也可以随时创建和销毁。
public StatusBar extends JLabel {
public StatusBar() {
AnnotationProcessor.process(this);
}
@EventSubscriber(eventClass=StatusEvent.class)
public void updateStatus(StatusEvent statusEvent) {
this.setText(statusEvent.getStatusText();
}
}
一个类似的项目是ELF (Event Listener Framework),但似乎还不成熟。
我目前正在研究有关Publish-Subscribe Event Driven Programming | Kev's Spring vs Java EE Dev和后续文章的事件通知框架。