Spring事件驱动模型

227 阅读1分钟

Spring事件驱动模型

spring事件驱动模型,是我们常说的发布订阅模式,常用于程序之间的解耦。这种模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。

发布订阅模式及其实现

事件 (Spring Event),即为定义的主题对象,一般需要一个事件源。在spring中有封装,只需要继承ApplicationEvent即可。

import org.springframework.context.ApplicationEvent;

public class DemoEvent extends ApplicationEvent {

    /**
     * 事件源
     * @param source
     */
    public DemoEvent(Object source) {
        super(source);
    }
}

发布者 (Spring Event Publish),将上面定义的event广播出去,在spring中广播,是广播到需要用到spring容器,ApplicationContext接口继承了ApplicationEventPublisher,所以以下demo直接用applicationContext直接广播。

Object object = new Object();
applicationContext.publishEvent(new DemoEvent(object);

订阅者 (Spring Event Listener)

  • 无序监听器,所有订阅者之间没有相互顺序。
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Component
public class DemoListener implements ApplicationListener<DemoEvent> {

    /**
     * 事件处理
     *
     * @param event
     */
    @Async
    @Override
    public void onApplicationEvent(DemoEvent event) {
        Object object = event.getSource();
        //do some services
    }
}

  • 有序监听器,所有订阅者之间有一个顺序。
import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.SmartApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class DemoOrderListener implements SmartApplicationListener {

   /**
    * 事件
    *
    * @param eventType 自定义的spring event
    * @return
    */
   @Override
   public boolean supportsEventType(final Class<? extends ApplicationEvent> eventType) {
       return eventType == DemoEvent.class;
   }


   /**
    * 事件源
    *
    * @param sourceType
    * @return
    */
   @Override
   public boolean supportsSourceType(final Class<?> sourceType) {
       return sourceType == Object.class;
   }

   /**
    * 自定义逻辑
    *
    * @param event
    */
   @Async
   @Override
   public void onApplicationEvent(final ApplicationEvent event) {
       Object object = event.getSource();
       //do some service
   }

   /**
    * 排序方式
    *
    * @return
    */
   @Override
   public int getOrder() {
       return 1;
   }
}
  • 注解监听器,spring4.2之后提供的一种简便写法。
@Async
@EventListener
public void handling(DemoEvent event){
    Object object = event.getSource();
    //do some services
}