Spring-Event必知必会
下文笔者讲述SpringEvent的必知必会,如下所示
SpringEvent简介说明
Spring Event是Spring框架提供一个事件机制
它允许应用程序组件之间通过发布-订阅模型进行松耦合的通信
这种机制基于观察者设计模式
当某个事件发生时
可通知所有注册该事件的监听器
并触发相应的处理逻辑
Spring Event常见的核心概念
事件(Event):
事件是表示应用程序中特定情况的对象
所有的事件都应该是 `ApplicationEvent` 类或其子类实例
发布者(Publisher):
发布者负责创建事件实例并将其发布给应用上下文
监听器(listener):
监听器是实现`ApplicationListener<E extends ApplicationEvent>`
接口类
用于接收和处理特定类型的事件
应用上下文(Application Context):
应用上下文充当事件分发器的角色
管理着事件的发布和监听器调用
Spring内置几种标准事件类型
例
`ContextRefreshedEvent`、`ContextStartedEvent` 等
这些事件会在应用上下文生命周期不同阶段自动发布
此外
开发者也可以定义自己的自定义事件以满足特定需求
当我们在程序中使用Spring Event
可实现模块间低耦合和高内聚
提高代码可读性和可维护性
同时方便功能扩展
Spring Event使用示例
添加依赖
在pom.xml文件中
添加 Spring Boot 和 Spring Event 的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.定义自定义事件
创建一个自定义事件类 CustomEvent
继承自ApplicationEvent:
package com.example.demo.event;
import org.springframework.context.ApplicationEvent;
public class CustomEvent extends ApplicationEvent {
private String message;
public CustomEvent(Object source, String message) {
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
}
3.创建事件监听器
创建一个事件监听器类 CustomEventListener
实现ApplicationListener接口
package com.example.demo.listener;
import com.example.demo.event.CustomEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class CustomEventListener implements ApplicationListener<CustomEvent> {
@Override
public void onApplicationEvent(CustomEvent event) {
System.out.println("Received custom event - " + event.getMessage());
}
}
4.发布事件
在 DemoApplication 类中,注入 ApplicationEventPublisher 并发布自定义事件: package com.example.demo; import com.example.demo.event.CustomEvent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.commandlinerunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationEventPublisher; @SpringBootApplication public class DemoApplication implements CommandLineRunner { @Autowired private ApplicationEventPublisher publisher; public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Override public void run(String... args) throws Exception { CustomEvent event = new CustomEvent(this, "Hello, Spring Event!"); publisher.publishEvent(event); } }
5.运行测试示例
运行 DemoApplication 类,启动 Spring Boot 应用程序 输出以下信息 com.sun.springevent.SpringEventApplication$$SpringCGLIB$$0@6e3ecf5c消息;时间:213228811331;消息:Hello, Spring Event!
二、Spring-Event执行原理
Spring Event机制
是Spring框架中的一个事件驱动模型
用于在应用程序的不同组件之间进行解耦和通信。下面是 Spring Event 的执行原理的详细解释:
1. 事件 (Event)
定义:事件是应用程序中发生的一个特定动作或状态变化。
实现:在 Spring 中,事件通常是由一个继承自 ApplicationEvent 的类表示的。例如,我们之前定义的 CustomEvent 就是一个自定义事件。
2. 事件发布者 (Event Publisher)
定义:事件发布者是负责创建并发布事件的组件。
实现:在 Spring 中,可以通过 ApplicationEventPublisher 接口来发布事件。通常,这个接口会通过依赖注入的方式注入到需要发布事件的类中。
3. 事件监听器 (Event Listener)
定义:事件监听器是负责处理事件的组件。
实现:在 Spring 中,可以通过实现 ApplicationListener 接口或者使用 @EventListener 注解来定义事件监听器。
4. 事件传播过程
1、事件创建:
事件发布者创建一个 ApplicationEvent 的实例,并传递必要的参数。
2、事件发布:
事件发布者调用 ApplicationEventPublisher 的 publishEvent 方法,将事件对象传递给 Spring 容器。
3、事件分发:
Spring 容器接收到事件后,会查找所有注册了该事件类型的监听器。
Spring 容器会调用每个监听器的 onApplicationEvent 方法(如果使用 ApplicationListener 接口)
或带有 @EventListener 注解的方法。
4、事件处理:
监听器接收到事件后,根据事件的内容执行相应的业务逻辑。
5. 异步事件处理
默认行为:Spring 事件默认是同步处理的,即事件发布者会等待所有监听器处理完事件后才会继续执行后续代码。
异步处理:可以通过配置 ApplicationEventMulticaster 来实现异步事件处理
可在application.properties 或 application.yml 中配置 TaskExecutor 来实现异步处理。
6. 示例代码解释
CustomEvent:定义了一个自定义事件类,继承自 ApplicationEvent,并添加了一个 message 属性。
CustomEventListener:定义了一个事件监听器类,实现ApplicationListener<CustomEvent> 接口
并重写onApplicationEvent 方法来处理事件。
DemoApplication:主类
实现CommandLineRunner 接口
在run方法中创建并发布了一个CustomEvent事件
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


