在开发工作中,会有一个场景。做了一些事情之后,需要广播一些消息或者通知,告诉其他模块处理一些事件。一般来说可以一个一个的发送请求通知,但是有一种更好的方式,那就是事件监控,这也是设计模式中发布-订阅模式和观察者模式的一种实现。
观察者模式:简单来说,当你在做某件事的时候,周围有人在盯着你看。当挣扎的鸵鸟做了一件让旁边看你的人感兴趣的事情,他会按照这个事情做别的事情,但是盯着你的人一定要跟你登记,否则你不能通知他(或者他没有资格盯着你)。
对于Spring容器的一些事件,您可以监听并触发相应的方法。通常有两种方法,ApplicationListener接口和@EventListener注释。
要成功创建侦听器并使其工作,在此过程中需要几个角色:
1.事件可以封装和传递要在侦听器中处理的参数,如对象或字符串,并充当侦听器中的监视目标。
2.侦听器基于事件发生的业务处理模块。这里,它可以接收封装在处理事件中的对象或字符串。
3.事件发布者是事件的触发器。
一、ApplicationListener 接口
应用程序侦听器接口定义如下:
@ FunctionalInterface
公共接口ApplicationListenerE扩展了ApplicationEvent扩展了EventListener {
/**
*处理应用程序事件。
* @param事件要响应的事件
*/
在应用事件上无效;
}
它是一个泛型接口,泛型类型必须是ApplicationEvent及其子类。只要实现了这个接口,当容器有相应的事件触发器时,就可以触发onApplicationEvent方法。ApplicationEvent类有许多子类,Spring框架附带了以下子类。
00-1010可以简单地通过实现ApplicationListener接口并将添加到容器中来使用。
@组件
公共类MyApplicationListener实现了applicationlistener applicationevent {
@覆盖
public void on application event(application event application event){ 0
System.out.println('事件触发器:' applicationevent.getclass()。getname());
}
}
以下是Spring Boot项目的启动类:
@回弹应用
公共类SpringEventExampleApplication {
公共静态void main(String[]args){ 0
springapplication . run(springeventexample application . class,args);
}
}
您可以参考以下示例项目:
运行上述Spring Boot项目会在Spring中默认触发一些事件,可以看到Console控制台的输出:
s://p3.toutiaoimg.com/origin/pgc-image/54e734eb08794cc288941dca034be094?from=pc">三、自定义事件和监听
下面实现自定义事件,并进行监听处理。示例项目的包结构如下所示,参考DDD领域模型的包结构。
(1)自定义事件
首先,我们需要定义一个时间(MyTestEvent),需要继承Spring的ApplicationEvent。
@Data
public class MyTestEvent extends ApplicationEvent {
private String message;
public MyTestEvent(Object source, String message) {
super(source);
this.message = message;
}
}
其中使用到了lombok提供的@Data注解。
(2)定义监听器
需要定义一下监听器,自己定义的监听器需要实现ApplicationListener接口,同时泛型参数要加上自己要监听的事件Class名,在重写的方法onApplicationEvent中,添加自己的业务处理逻辑:
@Component
public class MyEventListener implements ApplicationListener<MyTestEvent> {
@Override
public void onApplicationEvent(MyTestEvent myTestEvent) {
System.out.println("自定义事件监听:" + myTestEvent.getMessage());
}
}
(3)事件发布
有了事件,有了事件监听者,那么什么时候触发这个事件呢?每次想让监听器收到事件通知的时候,就可以调用一下事件发布的操作。首先在类里自动注入了ApplicationEventPublisher,这个也就是我们的ApplicationContext,它实现了这个接口。
@Component
public class MyTestEventPublisher {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
// 发布事件
public void publishEvent(String message) {
applicationEventPublisher.publishEvent(new MyTestEvent(this, message));
}
}
四、测试自定义事件和监听
创建一个RestController,可以从外部发起Request请求,触发自定义事件。
@RestController
public class TestEventController {
@Autowired
private MyTestEventPublisher publisher;
@GetMapping("/publish")
public void publishEvent() {
publisher.publishEvent("Hello world.");
}
}
启动示例项目,通过Postman发起Request请求:localhost:8080/publish
可以在控制台看到输出信息,如图所示,监听到MyTestEvent事件,打印输出事件内容。
(此处已添加圈子卡片,请到今日头条客户端查看)下一篇文章,将介绍@EventListener注解。除了通过实现接口,还可以使用@EventListener 注解,实现任意的方法都能监听事件。