最近公司在重构广告系统,其中核心的打包功由广告系统调用,即对apk打包的调用和打包完成之后的回调,需要提供相应的接口给广告系统,因此,为了将apk打包的核心流程和对接广告系统的业务解耦,利用了春天的事件监听特性来满足需求。以下说明春天的事件机制的相关内容。
首先春天事件分为事件发布者(EventPublisher)事件监听者(EventListener),还包括一个事件广播者(这个是春季实现相关,这一节不讨论)。使用春天事件机制,需要自定义事件发布者和监听者。
春季的事件监听(也称事件驱动)是观察者模式的一种实现,比较常见的有发布-订阅模型。通常我们利用消息队列来实现不同系统之间的解耦,如用户注册完成后,可以向消息队列发布一条消息,然后订阅了此主题的子系统(如邮件服务,积分服务)收到发布的消息之后,就会做相应的处理。这样做的好处是避免了在注册服务里耦合其他服务的代码,并且,执行子系统的业务将会异步执行,互不影响。下图是一个经典的观察者模式的结构。
以下为上述观察者模式的java简单实现:
<强> (1)Subject.java 强>
包observerPattern; 进口java.util.ArrayList; 进口并不知道;/* * *由司法院> 包observerPattern;/* * *由司法院> 包observerPattern;/* * *由司法院> 包observerPattern;/* * *由司法院> 包observerPattern;/* * *由司法院alt="春天的事件监听机制示例详解">
春也对事件驱动模型提供了支持,该模型主要由三部分组成:
(1),事件(ApplicationEvent):继承了jdk的EventObject,在春天项目中可以继承ApplicationEvent,来自定义自己的事件。
春容器内部对ApplicationEvent有着下面几个实现,通过名字可以很清楚事件所描述的行为。
@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); }//发布早期应用程序事件现在我们终于有一个多播… Set
earlyEventsToProcess=this.earlyApplicationEvents; 这一点。earlyApplicationEvents=零; 如果(earlyEventsToProcess !=null) { (ApplicationEvent earlyEvent: earlyEventsToProcess) { getApplicationEventMulticaster () .multicastEvent (earlyEvent); } } }
在AbstractApplicationContext中publishEvent: