一、组成部分
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