Spring Event 的介绍

简介: Spring Event 是 Spring 框架中的事件驱动机制,允许组件间进行同步或异步消息传递,无需直接依赖。它包括事件(Event)、事件发布者(Publisher)和事件监听器(Listener),通过 `ApplicationEventPublisher` 广播事件,实现松耦合通信,增强模块化和可维护性。Spring 还提供了多种内置事件,如 `ContextRefreshedEvent` 和 `ContextClosedEvent`,支持同步及异步处理,并具备良好的扩展性。

Spring Event 是 Spring 框架中的一种事件驱动机制,允许组件之间进行异步同步的消息传递,而不需要直接的依赖关系。通过 Spring Event,应用程序的各个模块可以松耦合地通信,促进模块化和可维护性。

核心概念

  1. 事件(Event) :事件是应用程序中发生的某种动作或变化的表示。Spring 中的事件通常是某个类的对象,它可以是自定义的或者使用内置的事件类(如 ContextRefreshedEvent)。
  2. 事件发布者(Publisher) :负责在某个事件发生时发布事件的组件。Spring 提供了 ApplicationEventPublisher 接口来实现事件发布。
  3. 事件监听器(Listener) :监听并处理发布的事件。监听器类实现 ApplicationListener 接口,或者使用 @EventListener 注解来标识事件处理方法。

Spring Event 工作原理

当事件发生时,事件发布者会通过 ApplicationEventPublisher 将事件广播到 Spring 应用上下文中,所有监听该事件类型的监听器会收到并处理这个事件。这种机制解耦了事件的产生者和消费者。

使用步骤

1. 定义事件类

可以通过继承 ApplicationEvent 类来自定义事件,或者直接创建一个 POJO 类作为事件。

scala

代码解读

复制代码

java
复制代码
public class UserCreatedEvent extends ApplicationEvent {
    private String username;

    public UserCreatedEvent(Object source, String username) {
        super(source);
        this.username = username;
    }

    public String getUsername() {
        return username;
    }
}

2. 发布事件

在需要发布事件的地方,使用 ApplicationEventPublisher 将事件发布出去。

typescript

代码解读

复制代码

java
复制代码
@Service
public class UserService {

    @Autowired
    private ApplicationEventPublisher publisher;

    public void createUser(String username) {
        // 业务逻辑
        System.out.println("User created: " + username);

        // 发布事件
        UserCreatedEvent event = new UserCreatedEvent(this, username);
        publisher.publishEvent(event);
    }
}

3. 监听事件

创建一个事件监听器类,监听发布的事件,可以通过实现 ApplicationListener 接口或使用 @EventListener 注解。

使用 ApplicationListener 接口:

csharp

代码解读

复制代码

java
复制代码
@Component
public class UserCreatedListener implements ApplicationListener<UserCreatedEvent> {

    @Override
    public void onApplicationEvent(UserCreatedEvent event) {
        System.out.println("Received user created event for: " + event.getUsername());
    }
}

使用 @EventListener 注解:

csharp

代码解读

复制代码

java
复制代码
@Component
public class UserCreatedEventHandler {

    @EventListener
    public void handleUserCreatedEvent(UserCreatedEvent event) {
        System.out.println("Handling user created event for: " + event.getUsername());
    }
}

4. 异步事件处理(可选)

如果希望事件处理过程是异步的,可以将监听器方法标记为异步。

  • 首先,需要在配置类上启用异步支持:

kotlin

代码解读

复制代码

java
复制代码
@Configuration
@EnableAsync
public class AsyncConfig {
}
  • 然后,在监听方法上使用 @Async 注解:

less

代码解读

复制代码

java
复制代码
@Component
public class UserCreatedEventHandler {

    @Async
    @EventListener
    public void handleUserCreatedEvent(UserCreatedEvent event) {
        System.out.println("Handling user created event asynchronously for: " + event.getUsername());
    }
}

Spring 内置事件

Spring 提供了多个内置的事件,可以监听 Spring 框架的生命周期事件,例如:

  1. ContextRefreshedEvent:当 ApplicationContext 被初始化或刷新时发布。
  2. ContextClosedEvent:当 ApplicationContext 关闭时发布。
  3. ContextStartedEvent:当 ApplicationContext 启动时发布。
  4. ContextStoppedEvent:当 ApplicationContext 停止时发布。

Spring Event 的特点

  1. 松耦合:事件驱动模型使组件之间的依赖性降低,事件发布者和事件监听器无需直接互相依赖。
  2. 同步与异步:事件可以同步处理,也可以通过 Spring 的 @Async 机制进行异步处理。
  3. 泛型支持ApplicationEventPublisher 支持发布任意类型的事件,监听器也可以处理泛型事件。
  4. 强大的扩展性:通过自定义事件类型,开发者可以将业务逻辑与事件机制紧密结合,构建复杂的异步事件驱动系统。

典型应用场景

  1. 用户注册事件:在用户注册完成后,可以发布一个事件,其他系统模块如邮件服务、通知服务可以异步监听该事件并发送欢迎邮件或推送消息。
  2. 订单系统:在电商系统中,订单完成时可以发布一个事件,促使库存系统、积分系统等模块各自处理订单相关的业务逻辑。
  3. 日志与监控:通过监听特定事件,开发者可以将关键事件(如用户登录、数据变更)记录到日志或监控系统中,方便后续分析和报警。

总结

Spring Event 提供了一种事件驱动的编程模型,允许松耦合的组件之间进行同步或异步通信,具有良好的扩展性和灵活性。在复杂的业务场景中,Spring Event 机制可以帮助开发者简化模块间的通信,提高代码的可维护性和可扩展性。


转载来源:https://juejin.cn/post/7411058675812106249

相关文章
|
7天前
|
设计模式 Java Spring
Spring Event 的幕后
Spring Event 基于观察者模式,实现模块间松散耦合的通信。通过事件(Event)、事件发布者(Publisher)和事件监听器(Listener)三个核心组件,Spring Event 可以轻松实现业务解耦。Spring 容器在启动时会初始化 `ApplicationEventMulticaster`,扫描并注册所有事件监听器,通过调用 `multicastEvent()` 方法将事件广播给所有注册的监听器。
|
4月前
|
消息中间件 Java 开发工具
【Azure 事件中心】Spring Cloud Stream Event Hubs Binder 发送Event Hub消息遇见 Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially 异常
【Azure 事件中心】Spring Cloud Stream Event Hubs Binder 发送Event Hub消息遇见 Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially 异常
|
4月前
|
Java Spring
【Azure 事件中心】Spring Boot 集成 Event Hub(azure-spring-cloud-stream-binder-eventhubs)指定Partition Key有异常消息
【Azure 事件中心】Spring Boot 集成 Event Hub(azure-spring-cloud-stream-binder-eventhubs)指定Partition Key有异常消息
|
Java Spring
Spring Event陷阱重重,我为何含泪放弃?
网络上比较推崇使用Spring Event 优雅的实现观察者模式。我在调研后也确实觉得这种方式能实现业务逻辑上的解耦,但线上的一次事故,让我意识到 Spring Event远远没有那么简单。
634 1
Spring Event陷阱重重,我为何含泪放弃?
|
Java Spring
深入理解Spring IOC之扩展篇(十)、SpringBoot中重要event介绍,顺便简单讲下SB的启动流程(二)
深入理解Spring IOC之扩展篇(十)、SpringBoot中重要event介绍,顺便简单讲下SB的启动流程(二)
118 0
|
XML Java 数据格式
深入理解Spring IOC之扩展篇(九)、SpringBoot中重要event介绍,顺便简单讲下SB的启动流程(一)
深入理解Spring IOC之扩展篇(九)、SpringBoot中重要event介绍,顺便简单讲下SB的启动流程(一)
121 0
|
设计模式 缓存 Java
深入理解Spring IOC之扩展篇(七)、Spring中的event以及自定义event
深入理解Spring IOC之扩展篇(七)、Spring中的event以及自定义event
125 0
|
消息中间件 存储 架构师
【首席架构师看Event Hub】Kafka深挖 -第2部分:Kafka和Spring Cloud Stream
【首席架构师看Event Hub】Kafka深挖 -第2部分:Kafka和Spring Cloud Stream
|
消息中间件 缓存 前端开发
「首席看Event Hub」如何在您的Spring启动应用程序中使用Kafka
「首席看Event Hub」如何在您的Spring启动应用程序中使用Kafka
|
消息中间件 架构师 Java
「首席架构师看Event Hub」Kafka的Spring 深入挖掘 -第1部分
「首席架构师看Event Hub」Kafka的Spring 深入挖掘 -第1部分