【SpringBoot3】应用程序启动监听

一、监听应用启动的常见场景

应用启动监听在 Spring Boot 和其他框架中扮演着重要的角色。它们的主要作用是在应用启动或关闭时触发特定的操作或任务。

以下是一些常见的应用启动监听场景:

  1. 初始化操作:在应用启动时,你可能需要执行一些特定的初始化操作,例如加载配置文件、建立数据库连接池等。通过实现 ApplicationListener 接口或使用 @EventListener 注解,你可以在这些关键时刻添加自定义逻辑,确保你的应用程序能够正确地启动并运行。
  2. 数据预处理:在应用启动时,你可能需要进行数据预处理,例如清理上一次运行遗留的垃圾数据或者将常用的数据加载到内存中。通过实现 CommandLineRunnerApplicationRunner 接口,你可以在应用启动后执行这些任务。
  3. 系统通知:当应用成功启动时,你可以发送一个系统通知,例如通过邮件或消息队列通知其他系统或管理员。这可以帮助你与其他系统集成,提供统一的监控和管理界面。
  4. 健康检查和监控:通过定义健康检查端点、指标收集等功能,你可以对应用进行健康检查和监控。这些功能通常由 Spring Boot Actuator 提供支持。通过监听相应的事件,你可以在应用启动时启用或禁用这些功能。
  5. 依赖服务检查:在应用启动阶段,可以检查依赖服务(如数据库、消息队列、缓存等)是否可用,并在不可用时采取适当的措施,如延迟启动或记录错误。这有助于确保你的应用程序能够在稳定的环境下正常运行。
  6. 动态配置更新:在一些情况下,你需要根据环境变量或其他条件来动态更新应用的配置。通过监听配置文件的修改事件,你可以在应用启动时重新加载配置,以适应不同的环境或配置变化。
  7. 日志记录:在应用启动过程中,你可能希望记录一些关键信息,例如启动时间、版本号、运行环境等。这将有助于问题排查和审计工作。
  8. 安全性检查:在某些情况下,你可能需要在应用启动阶段执行安全性相关的检查,例如验证加密密钥、检查安全漏洞等。通过监听相应的事件,你可以执行这些检查以确保应用的安全性。

二、监听应用启动的方法

在 Spring Boot 中,你可以通过实现 ApplicationListener 接口、使用 @EventListener 注解或实现 CommandLineRunner / ApplicationRunner 接口来创建自定义的启动监听器。这些监听器使得你能够在应用生命周期的关键时刻执行自定义逻辑,从而增强应用的可用性、可维护性和健壮性。

在 Spring Boot 应用中,你可以通过实现特定的接口或使用注解来监听应用的启动和关闭事件。以下是一些常见的方法:

1)实现 ApplicationListener 接口

你可以创建一个类来实现 ApplicationListener 接口,并指定要监听的事件类型。例如,要监听应用启动完成事件,你可以这样做:

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class MyApplicationListener implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        // 处理应用启动完成事件
    }
}

2)使用 @EventListener 注解

在 Spring 4.2 及以上版本中,你可以使用 @EventListener 注解来监听事件,而无需实现 ApplicationListener 接口。例如:

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

@Component
public class MyEventListener {

    @EventListener(ApplicationReadyEvent.class)
    public void onApplicationReadyEvent(ApplicationReadyEvent event) {
        // 处理应用启动完成事件
    }
}

3)使用 ApplicationRunnerCommandLineRunner 接口

虽然这不是严格意义上的监听器,但 ApplicationRunnerCommandLineRunner 接口提供了一种在应用启动后执行代码的方法。这两个接口非常相似,唯一的区别是 CommandLineRunnerrun 方法接收一个字符串数组作为参数,而 ApplicationRunnerrun 方法接收一个 ApplicationArguments 对象。

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class MyApplicationRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 应用启动后执行代码
    }
}

4)Spring Boot Actuator 的健康检查和指标

虽然不是监听器,但如果你想要在应用运行时监控其状态,你可以使用 Spring Boot Actuator。它提供了健康检查、指标收集等功能。

5)Spring Framework 的事件监听

除了 Spring Boot 提供的事件外,你还可以监听 Spring Framework 定义的事件,例如 ContextRefreshedEvent(当 ApplicationContext 被初始化或刷新时触发)。

记住,当你创建监听器时,确保它们被 Spring 容器管理(例如,通过 @Component 注解将它们声明为 bean),这样它们才能正确接收到事件通知。

三、SpringBoot不同阶段的事件

Spring Boot应用启动过程中的不同阶段分表对应不同的事件:

1)ApplicationStartingEvent

  • 这个事件在应用启动开始时触发,非常早期,甚至在任何 Spring 容器刷新之前。
  • 它通常用于执行非常早期的初始化代码,或者监听系统属性、环境变量等。

2)ApplicationEnvironmentPreparedEvent

  • 当 Spring Boot 的 Environment 准备好并且已经应用了任何可用的 PropertySource,但在 ApplicationContext 创建之前触发。
  • 你可以使用这个事件来修改或添加属性源。

3)ApplicationPreparedEvent

  • 在 Spring 上下文被刷新之前,但在 bean definitions 被加载之后触发。
  • 此时,你可以访问应用上下文,但是 beans 还没有被创建。

4)ApplicationStartedEvent

  • 在 Spring 上下文刷新之后触发,意味着所有的 bean 已经被创建,但还没有调用任何 CommandLineRunnerApplicationRunner
  • 此时,应用已经启动,但可能还没有准备好处理请求。

5)ApplicationReadyEvent

  • 当应用已经启动并且准备好了处理请求时触发。
  • 这通常意味着所有的 CommandLineRunnerApplicationRunner 都已经被调用,并且应用已经完成了其启动过程。

6)ApplicationFailedEvent

  • 如果应用启动失败,则会触发此事件。
  • 这允许你执行一些清理工作,或者记录关于失败的信息。

通过监听这些事件,你可以在应用启动和关闭的不同阶段执行自定义逻辑,从而实现更精细的控制和扩展性。例如,你可能希望在 ApplicationReadyEvent 触发后发送一个通知,表明应用已成功启动并准备好接收请求。或者,在 ApplicationFailedEvent 触发时,你可能想要记录详细的错误日志,并通知管理员。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

顽石九变

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

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

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

打赏作者

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

抵扣说明:

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

余额充值