我们开发中经常遇到监听事件,首先我们先来了解下事件相关知识:
使用场景(场景一):银行操作转账成功后需要给客户发送短信和邮件,使用事件就可以实现解耦并异步。
我们监听事件之前要有事件源source,创建事件源(Event),发布事件(publishEvent),然后才能到监听事件。
事件驱动机制是观察者模式(称发布订阅)具体实现,事件对象(Event)相当于被观察对象(Subject), 事件监听(EventListener) 相当于观察者(Observer)
目录
1. 事件源:在发布事件前传入的参数
2. 创建事件源(Event)
3. 发布事件(publishEvent)
4. 监听事件,两种方式:
4.1 注解@EventListener方式监听事件:
4.2 实现ApplicationListener接口监听事件
5. 事件驱动机制和MQ驱动机制对比
6. 发布、监听事件添加@Async异步
7. Spring容器自带发布机制
1. 事件源:在发布事件前传入的参数
可以是变量或者是自定义对象(类似于有参数)。
2. 创建事件源(Event)
创建事件源需要继承ApplicationEvent
public class MyEvent extends ApplicationEvent { /** * Create a new ApplicationEvent. * * @param source the object on which the event initially occurred (never {@code null}) */ public MyEvent(Object source) { super(source); } }
3. 发布事件(publishEvent)
注入ApplicationEventPublisher类可以直接调用publishEvent方法进行发布事件。
@Service public class TestPublishEventServiceImpl { @Autowired private ApplicationEventPublisher applicationEventPublisher; @Async // 异步注解 public void testPublishEvent() { System.out.println("业务代码已完成,下面开始发送短信及邮件"); // 发送一个事件可以让发送短信和邮件都接收同一个事件(如果需要传不同的参数,就需要发布两个不同的事件) applicationEventPublisher.publishEvent(new MyEvent("事件源--自定义的事件触发了。。。")); }
4. 监听事件,两种方式:
4.1 注解@EventListener方式监听事件:
在方法上添加@EventListener注解,即可监听
@Component public class MyListenerEvent { @Async // 异步方式 @EventListener // 监听器注解 public void myListenerEvent(MyEvent event) { System.out.println("获取到的事件源 = " + event.getSource()); System.out.println("注解方式--接收到MyEvent事件,发送短信/发送邮件"); } }
4.2 实现ApplicationListener接口监听事件
实现ApplicationListener接口,泛型既是需要添加的事件对象
@Component public class MyListener implements ApplicationListener<MyEvent> { @Async // 异步方式 @Override public void onApplicationEvent(MyEvent event) { System.out.println("获取到的事件源 = " + event.getSource()); System.out.println("添加接收到MyEvent事件,发送短信/发送邮件"); } }
5. 事件驱动机制和MQ驱动机制对比
MQ驱动的作用:解耦、异步、削峰,就不过多解释了。
优点:MQ可供并发量大、微服务使用
缺点:使用MQ会提升架构的复杂度,维护性降低。
事件驱动机制:解耦、异步,做不到削峰。
优点:spring框架自带易维护,集成简单
缺点:无法支撑大并发,只能单机通知,无法排队,无法削峰。
总结:消息量不大时就可以使用事件驱动机制
6. 发布、监听事件添加@Async异步
启动类必须要添加@EnableAsync才能生效
发布事件或监听事件任意一个加上异步@Async即可,推荐发布事件(publishEvent)加异步。
如果publishEven和EventListener过程中都有大量处理数据库或其他耗时的业务,也可以两者同时加上@Async。文章来源:https://www.toymoban.com/news/detail-465067.html
7. Spring容器自带发布机制
spring容器(ApplicationContextEvent)在,创建,刷新,停止,关闭都有相应的操作,我们可以利用这个做一系列容器相关的操作。比如我们可以在容器关闭的时候关闭nacos主动下线操作。文章来源地址https://www.toymoban.com/news/detail-465067.html
到了这里,关于java 实现事件监听EventListener的方式详解及分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!