首页 > 其他分享 >spring事件发布与监听

spring事件发布与监听

时间:2022-10-25 16:46:52浏览次数:39  
标签:String spring 监听 topic 事件 simpleEvent eventData public

一、组成部分

spring的事件监听有三个部分组成,事件(ApplicationEvent)、监听器(ApplicationListener)和事件发布操作。

二、具体实现

事件

事件对象就是一个简单的po实体类

1、需要实现接口ApplicationEvent,

2、构造方法需要设置super

3、我们可以另外拓展一些子类来区分不同事件的实体

public abstract class BaseEvent<T> extends ApplicationEvent {

    protected T eventData;
    protected String topic;

    /**
     * Create a new {@code ApplicationEvent}.
     *
     * @param source 事件产生处所在类的对象
     * @param eventData 表示在事件传播过程中,需要传输的对象,随意设置数据类型
     * @param topic topic
     */
    public BaseEvent(Object source, T eventData,String topic) {
        super(source);
        this.eventData = eventData;
        this.topic = topic;
    }

    public T getEventData() {
        return eventData;
    }
    public String getTopic(){
        return topic;
    }
}

子类举例

public class SimpleEvent<T> extends BaseEvent {
    //需要传输的事件主题
    private String topic;
    //用于接受事件的返回值
    private List result;
    public SimpleEvent(Object source) {
        super(source);
    }
    public SimpleEvent(Object source, T eventData) {
        super(source, eventData);
    }
    public SimpleEvent(Object source, T eventData, String topic) {
        super(source,eventData);
        this.topic = topic;
    }
    public void setResult(List<String> result) {
        this.result = result;
    }
    public String getTopic() {
        return topic;
    }
    public List<String> getResult() {
        return result;
    }
}

发布者

发布者很简单,需要注意三点

1、注入到spring容器中

2、引入应用上下文让我们的事件发布到流程中

3、调用 publishEvent 时传入事件po对象

@Component
public class SimpleEventPublisher<T> {
    @Resource
    ApplicationContext applicationContext;
    public void publish(T msg) {
        applicationContext.publishEvent(new SimpleEvent<>(this, msg));
    }
    public void publish(T msg, String topic) {
        applicationContext.publishEvent(new SimpleEvent<>(this, msg, topic));
    }
    public List<String> publishAndReceive(T msg, String topic) {
        SimpleEvent<T> simpleEvent = new SimpleEvent<>(this, msg, topic);
        applicationContext.publishEvent(simpleEvent);
        return simpleEvent.getResult();
    }
}

监听者

两种实现方式

1、@EventListener 注解实现

  @EventListener 所在的监听方法是根据参数列表的EventPo类型来进行监听的,正常来讲对不同的事件po监听需要对应不同的监听方法。

  @EventListener 也有两个参数 classes(事件po类) 和 condition(满足条件走此方法) ,这两个参数默认不用填写

  如果多个监听方法的入参事件po列表一致,就会重复监听同一个事件。

2、类实现

  实现 ApplicationListener<事件PO>  并重写方法就行

@Component
public class SimpleEventListener {
    public static final String eventBindTopic ="event#setNeedBindInfo";
    public static final String eventBindBackTopic ="event#setBindBackTopic";
    @Order(0)
    @EventListener
    public void doMsg(SimpleEvent<String> simpleEvent){
        if (simpleEvent.getTopic().equals(eventBindTopic)){
            UserEventDto eventData = (UserEventDto) simpleEvent.getEventData();
            log.info("普通监听器-》接受到事件[{}],数据体【{}】",simpleEvent.getTopic(),eventData);
        }else if (simpleEvent.getTopic().equals("event#setBindBackTopic")){
            // 由于传入的事件与前面发布的事件内存地址指向的是同一个,这里可以设置值用于返回
            simpleEvent.setResult(Collections.singletonList("这里是返回参数pong"));
            log.info("有返回值监听器-》 topic【{}】,全数据体【{}】",simpleEvent.getTopic(), simpleEvent);
        }else {
            log.info("无匹配监听器 topic【{}】,数据体【{}】", simpleEvent.getTopic(),simpleEvent.getEventData());
        }
    }
}

三、原理探寻

 

标签:String,spring,监听,topic,事件,simpleEvent,eventData,public
From: https://www.cnblogs.com/dreamzy996/p/16825369.html

相关文章