文章目录机制定义event 被观察者定义listener 观察者发布事件 controller或者service中代码为什么要用事件这里的解耦是谁和谁的解耦?是串行还是并行的会不会重复接收可以实现一对多吗?事件和redis和mq和如何选spring事件机制笔记、发布和监听。spring事件用的是观察者模式最大的好处就是解耦。机制ApplicationListener # 简称listener业务listenerApplicationEvent # 简称event业务eventApplicationEventPublisher # 简称publisher业务代码中注入使用1、spring的listener本身就是基于事件监听的。2、当publisher.publishEvent()发布事件时会根据事件类型到listeners里去匹配匹配到之后调用listener.onApplicationEvent()来调用处理方法。定义event 被观察者代码publicclassUserEventextendsApplicationEvent{privateIntegertype;publicUserEvent(Objectsource){super(source);}publicIntegergetType(){returntype;}publicvoidsetType(Integertype){this.typetype;}}注source是必须的type是自定义的当然也可以定义多个属性。定义listener 观察者代码Slf4jComponentEnableAsyncpublicclassUserListenerimplementsApplicationListenerUserEvent{OverrideAsync(asyncUserTaskExecutor)publicvoidonApplicationEvent(UserEventevent){//获取扩展字段参数MapString,Objectparams(MapString,Object)event.getSource();if(1type){}else{}}}发布事件 controller或者service中代码代码// spring自带直接注入AutowiredprivateApplicationEventPublisherapplicationEventPublisher;// 业务方法publicvoidddd(){MapString,ObjectsourcenewHashMap(3);source.put(aaaa,91110113MA01ULE671));UserEventeventnewUserEvent(source);event.setType(1);applicationEventPublisher.publishEvent(event);// 发布}为什么要用事件如果不用事件用代码硬写也是可以的。但是不优雅事件完全做到了解耦。即 发布-消息-接收。中间是以消息传递的发布和接收的动作单独完成实现了解耦。这里的解耦是谁和谁的解耦?是事件和业务的解耦吗?例如下单事件和保存订单信息。不是而是事件和监听者的解耦。例如下单业务-发送站内信、发信息给仓库等是串行还是并行的默认是串行加上EnableAsync和Async可以实现并行。会不会重复接收实测不会服务内发布服务内接收不会跳到其他节点。可以实现一对多吗?当然是可以的多个listener观察者监听同一个事件即可。如果要新增观察者或者去掉观察者直接新增或去掉listener即可。这实现了松耦合代码比较优雅。事件和redis和mq和如何选他们都有通信功能。实现方式描述event解耦、轻量、spring自带。最适合同服务内通信。redis相对重量点当然redis基本也是标配。更适合跨服务的通信。mq更加重量点如果没相关业务可以不配置mq。更适合同集团不同系统间通信例如不同系统间肯定不能用同一个redis密码也不能互相告诉。用mq就比较合适。