尽管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和后续文章的事件通知框架。

07-24 14:30