Spring事件驱动模型

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
}
复制代码

转载于:https://juejin.im/post/5b419c64f265da0f563dbb7f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值