春天的事件监听机制示例详解

  

  

最近公司在重构广告系统,其中核心的打包功由广告系统调用,即对apk打包的调用和打包完成之后的回调,需要提供相应的接口给广告系统,因此,为了将apk打包的核心流程和对接广告系统的业务解耦,利用了春天的事件监听特性来满足需求。以下说明春天的事件机制的相关内容。

  

首先春天事件分为事件发布者(EventPublisher)事件监听者(EventListener),还包括一个事件广播者(这个是春季实现相关,这一节不讨论)。使用春天事件机制,需要自定义事件发布者和监听者。

  


  

  

春季的事件监听(也称事件驱动)是观察者模式的一种实现,比较常见的有发布-订阅模型。通常我们利用消息队列来实现不同系统之间的解耦,如用户注册完成后,可以向消息队列发布一条消息,然后订阅了此主题的子系统(如邮件服务,积分服务)收到发布的消息之后,就会做相应的处理。这样做的好处是避免了在注册服务里耦合其他服务的代码,并且,执行子系统的业务将会异步执行,互不影响。下图是一个经典的观察者模式的结构。

  

春天的事件监听机制示例详解

  

以下为上述观察者模式的java简单实现:

  

<强> (1)Subject.java

        包observerPattern;      进口java.util.ArrayList;   进口并不知道;/* *   *由司法院>   包observerPattern;/* *   *由司法院>   包observerPattern;/* *   *由司法院>   包observerPattern;/* *   *由司法院>   包observerPattern;/* *   *由司法院alt="春天的事件监听机制示例详解">

  


  

  

春也对事件驱动模型提供了支持,该模型主要由三部分组成:

  

(1),事件(ApplicationEvent):继承了jdk的EventObject,在春天项目中可以继承ApplicationEvent,来自定义自己的事件。

  

春容器内部对ApplicationEvent有着下面几个实现,通过名字可以很清楚事件所描述的行为。

  

春天的事件监听机制示例详解”>,</p>
  <p>(2)发布者(ApplicationEventPublisher):实现这个接口,就可以使得弹簧组件有发布事件的能力。</p>
  <p>可以看的到,ApplicationContext实现了此接口,因此,可以弹簧组件可以通过实现ApplicationContextAware接口,注入ApplicationContext,然后,通过ApplicationContext的publishEvent()方法来实现事件传播,</p>
  <p>当然,也可以直接实现ApplicationEventPublisher接口,重写publishEvent()方法,同样可以实现事件传播。</p>
  <p> <img src=   @Override   公共空间addApplicationListener (ApplicationListener<& # 63;比;侦听器){   断言。notNull(侦听器,“ApplicationListener不得空”);//侦听器传入持有的一个的applicationEventMulticaster类中   如果这一点。applicationEventMulticaster !=null) {   this.applicationEventMulticaster.addApplicationListener(听众);   }   this.applicationListeners.add(听众);   }//省略部分代码      受保护的空白有关registerlistener () {//静态指定侦听器注册。   (ApplicationListener<& # 63;比;听众:getApplicationListeners ()) {   getApplicationEventMulticaster () .addApplicationListener(听众);   }//不初始化FactoryBeans:我们需要把所有常规的bean//未初始化,让后处理器适用于他们!   String [] listenerBeanNames=getBeanNamesForType (ApplicationListener。类,真、假);   (字符串listenerBeanName: listenerBeanNames) {   getApplicationEventMulticaster () .addApplicationListenerBean (listenerBeanName);   }//发布早期应用程序事件现在我们终于有一个多播…   SetearlyEventsToProcess=this.earlyApplicationEvents;   这一点。earlyApplicationEvents=零;   如果(earlyEventsToProcess !=null) {   (ApplicationEvent earlyEvent: earlyEventsToProcess) {   getApplicationEventMulticaster () .multicastEvent (earlyEvent);   }   }   }      

在AbstractApplicationContext中publishEvent:

春天的事件监听机制示例详解