<返回更多

SpringBoot事件监听:应用监听接口的使用

2021-04-07  今日头条  软件架构软件架构
加入收藏

在开发工作中,会遇到一种场景,做完某一件事情以后,需要广播一些消息或者通知,告诉其他的模块进行一些事件处理,一般来说,可以一个一个发送请求去通知,但是有一种更好的方式,那就是事件监听,事件监听也是设计模式中 发布-订阅模式、观察者模式的一种实现。

观察者模式:简单的来讲就是你在做事情的时候身边有人在盯着你,当你做的某一件事情是旁边观察的人感兴趣的事情的时候,他会根据这个事情做一些其他的事,但是盯着你看的人必须要到你这里来登记,否则你无法通知到他(或者说他没有资格来盯着你做事情)。

 

对于 Spring 容器的一些事件,可以监听并且触发相应的方法。通常的方法有 2 种,ApplicationListener 接口和@EventListener注解

要想顺利地创建监听器,并起作用,这个过程中需要这样几个角色:

1、事件(event)可以封装和传递监听器中要处理的参数,如对象或字符串,并作为监听器中监听的目标。

2、监听器(listener)具体根据事件发生的业务处理模块,这里可以接收处理事件中封装的对象或字符串。

3、事件发布者(publisher)事件发生的触发者。

 

一、ApplicationListener 接口

ApplicationListener 接口的定义如下:

SpringBoot事件监听:应用监听接口的使用

 

@FunctionalInterface

public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {

 

/**

* Handle an application event.

* @param event the event to respond to

*/

void onApplicationEvent(E event);

}

它是一个泛型接口,泛型的类型必须是 ApplicationEvent 及其子类,只要实现了这个接口,那么当容器有相应的事件触发时,就能触发 onApplicationEvent 方法。ApplicationEvent 类的子类有很多,Spring 框架自带的如下几个。

SpringBoot事件监听:应用监听接口的使用

 



专栏
Kafka v2.3 快速入门与实践
作者:软件架构
29.8币
73人已购
查看

二、实现一个ApplicationListener接口

使用方法很简单,就是实现一个 ApplicationListener 接口,并且将加入到容器中就行。

@Component

public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {

@Override

public void onApplicationEvent(ApplicationEvent applicationEvent) {

System.out.println("事件触发:" + applicationEvent.getClass().getName());

}

}

下面是Spring Boot 项目的启动类:

@SpringBootApplication

public class SpringEventExampleApplication {

 

public static void main(String[] args) {

SpringApplication.run(SpringEventExampleApplication.class, args);

}

}

可以参考下面的示例项目:

SpringBoot事件监听:应用监听接口的使用

 

运行上述的Spring Boot项目,会触发Spring 默认的一些事件,可以看到Console控制台输出:

SpringBoot事件监听:应用监听接口的使用

 

三、自定义事件和监听

下面实现自定义事件,并进行监听处理。示例项目的包结构如下所示,参考DDD领域模型的包结构。

SpringBoot事件监听:应用监听接口的使用

 

(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

SpringBoot事件监听:应用监听接口的使用

 

可以在控制台看到输出信息,如图所示,监听到MyTestEvent事件,打印输出事件内容。

SpringBoot事件监听:应用监听接口的使用
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>