重学SpringBoot3-事件与监听器

本文详细介绍了SpringBoot3中的事件和监听器概念,列举了SpringBoot生命周期中的关键事件,展示了如何定义和使用自定义事件,以及如何进行异步事件处理,以实现应用的模块化和高效通信。
摘要由CSDN通过智能技术生成

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

Spring Framework 提供了一个强大的事件发布和监听机制,允许应用组件在发生特定操作时相互通信,而无需直接引用对方。这种基于事件的通信方式有助于实现松耦合的架构,增强应用的模块化。Spring Boot 3 继承并增强了这一机制,让开发者能够更便捷地使用事件和监听器来处理应用中的各种业务场景。本文将深入探讨 Spring Boot 3 中的事件和监听器,包括它们的工作原理、如何定义和使用它们,以及一些实际应用场景。

事件和监听器的基本概念

在 Spring 框架中,事件(Events)是对发生在应用程序或 Spring 上下文中的操作或更改的封装。事件可以由任何组件发布,并由感兴趣的组件(监听器)接收和处理。

监听器(Listeners)是定义了如何响应特定事件的组件。在 Spring 中,监听器订阅特定类型的事件,并在事件发生时被自动触发。

Spring Boot中的事件类型

9大事件

Spring Boot 的生命周期事件为应用的启动和关闭提供了详细的上下文信息,使得开发者能够根据不同阶段执行特定的逻辑。这些事件按照它们触发的顺序,大致可以分为以下九种:

1. ApplicationStartingEvent

  • 触发时机:这是第一个事件,它在运行 SpringApplication.run() 方法时触发,即应用启动的最早阶段,此时 Spring 应用上下文(ApplicationContext)还未创建。
  • 作用:可以用于执行一些最早期的初始化工作,比如注册监听器或初始化器等。

2. ApplicationEnvironmentPreparedEvent

  • 触发时机:当 SpringApplication 准备好 Environment(但在创建 ApplicationContext 之前)时触发。
  • 作用:允许修改配置属性或做一些基于环境的预处理。

3. ApplicationContextInitializedEvent

  • 触发时机:当 ApplicationContext 准备好但未加载任何 bean 定义时触发,这个事件是 Spring Boot 2.1 新增的。
  • 作用:适合在加载 bean 定义之前执行一些操作,比如注册自定义的bean定义。

4. ApplicationPreparedEvent

  • 触发时机:当 ApplicationContext 已经加载但还未刷新时触发,此时所有的bean定义都已加载但还未创建实例。
  • 作用:可以用于设置需要在刷新上下文之前完成的任何处理。

5. ApplicationStartedEvent

  • 触发时机:Spring Boot 2.2 中引入,替代了 ApplicationReadyEvent 作为上下文刷新后立即发布的事件,但在任何回调和应用程序(ApplicationRunner)和命令行运行器(CommandLineRunner)被调用之前。
  • 作用:标志着应用已经启动且准备好接收请求。

6. AvailabilityChangeEvent

  • 触发时机:Spring Boot 2.3 中引入,它是一个框架级事件,用于表示应用程序可用性(Availability)的状态变化,如LivenessState.CORRECT 应用存活,又叫存活探针
  • 作用:通过监听这些状态变化,应用可以做出相应的响应,在容器化环境中,存活状态用于指导容器编排系统(如 Kubernetes)决定是否需要重启容器。

7. ApplicationReadyEvent

  • 触发时机:在任何任何应用程序(ApplicationRunner)和命令行运行器(CommandLineRunner)被调用后,且 SpringApplication.run() 方法即将结束之前触发。
  • 作用:表示应用已经准备好接收HTTP请求,通常用于执行一些最终的启动逻辑。

8. AvailabilityChangeEvent

  • 触发时机:就绪状态ReadinessState.ACCEPTING_TRAFFIC 就绪探针,表示应用正在正常运行,没有遇到无法恢复的错误或故障。
  • 作用:在微服务架构中,就绪状态通常意味着服务已经完全启动,并且可以开始处理外部请求。

9. ApplicationFailedEvent

  • 触发时机:如果启动时出现异常,则触发此事件。
  • 作用:可以用于处理启动过程中的异常,进行错误记录或额外的错误处理逻辑。

通过监听和响应这些事件,开发者可以在应用的生命周期的关键时刻插入自定义逻辑,增强应用的灵活性和健壮性。这些事件提供了一种强大的机制,用于监控和管理应用的状态变化。

以上内容可以查看源码:org.springframework.boot.SpringApplication#run(java.lang.String…)

源码

定义和使用自定义事件

除了使用 Spring Boot 提供的事件外,你还可以定义自己的事件和监听器来处理特定的业务逻辑。以下是创建和使用自定义事件的步骤:

定义一个事件

自定义事件通常是 ApplicationEvent 的子类:

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;
    }
}

创建事件监听器

有两种方式可以创建事件监听器:实现 ApplicationListener 接口或使用 @EventListener 注解。

实现ApplicationListener接口

import org.springframework.context.ApplicationListener;

public class CustomEventListener implements ApplicationListener<CustomEvent> {
    @Override
    public void onApplicationEvent(CustomEvent event) {
        System.out.println("Received custom event - " + event.getMessage());
    }
}

使用@EventListener注解

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class CustomEventListener {

    @EventListener
    public void handleCustomEvent(CustomEvent event) {
        System.out.println("Received custom event - " + event.getMessage());
    }
}

发布事件

在Spring应用中,你可以通过 ApplicationEventPublisher 接口发布事件:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;

@Component
public class CustomEventPublisher {

    @Autowired
    private ApplicationEventPublisher publisher;

    public void publishEvent(final String message) {
        CustomEvent customEvent = new CustomEvent(this, message);
        publisher.publishEvent(customEvent);
    }
}

测试事件

事件的异步处理

默认情况下,事件的处理是同步进行的,即事件监听器的处理逻辑会阻塞发布事件的线程。然而,Spring 也支持异步事件监听器,可以通过 @Async 注解来实现这一点。请注意,要使用 @Async,需要在配置类上开启异步支持:

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;

@Configuration
@EnableAsync
public class AsyncConfig {
}

然后,你可以在事件监听器上使用 @Async 注解:

import org.springframework.scheduling.annotation.Async;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class AsyncCustomEventListener {

    @Async
    @EventListener
    public void handleCustomEvent(CustomEvent event) {
        // 异步处理事件
    }
}

通过使用异步事件监听器,你可以提高应用的性能和响应能力,尤其是在处理耗时操作时。

异步事件监听

总结

Spring Boot 中的事件和监听器提供了一种强大且灵活的方式来实现应用组件间的松耦合通信。无论是使用 Spring Boot 内置的事件还是定义自己的自定义事件,事件驱动的机制都能帮助你构建更加模块化和可维护的应用。通过合理利用事件和监听器,以及掌握同步和异步事件处理的技巧,可以在 Spring Boot 应用中实现复杂的业务逻辑,同时保持代码的清晰和简洁。

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Springboot拦截器、过滤器和监听器是用来处理请求和响应的组件。拦截器是基于Java的反射机制,可以在请求处理前后进行一些操作,比如记录日志、权限验证等。过滤器是基于Servlet规范的,可以在请求进入Servlet之前或响应返回给客户端之前进行一些操作,比如字符编码、请求过滤等。监听器是用来监听Web应用程序中的事件,比如ServletContext的创建和销毁、Session的创建和销毁等。\[1\] 在Springboot中,可以通过在application类上添加注解@SpringBootApplication和@ServletComponentScan来启用拦截器、过滤器和监听器。\[2\]拦截器、过滤器和监听器都是通过实现相应的接口来实现的。例如,创建一个过滤器可以通过实现Filter接口,并在@Component注解中添加@Order注解来指定过滤器的执行顺序。\[3\] 拦截器、过滤器和监听器Springboot中都可以起到不同的作用,可以根据具体需求选择使用哪种组件来处理请求和响应。 #### 引用[.reference_title] - *1* *2* [springBoot(6)---过滤器,监听器,拦截器](https://blog.csdn.net/yudiandemingzi/article/details/80399971)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [SpringBoot拦截器-过滤器-监听器](https://blog.csdn.net/weixin_45203607/article/details/120250823)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CoderJia_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值