SpringBoot应用程序启动监听功能的常见方法

 更新时间:2024年05月21日 11:11:45   作者:顽石九变  
应用启动监听在 Spring Boot 和其他框架中扮演着重要的角色,它们的主要作用是在应用启动或关闭时触发特定的操作或任务,本文给大家介绍了SpringBoot应用程序启动监听功能的常见方法,需要的朋友可以参考下

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

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

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

  1. 初始化操作:在应用启动时,你可能需要执行一些特定的初始化操作,例如加载配置文件、建立数据库连接池等。通过实现 ApplicationListener 接口或使用 @EventListener 注解,你可以在这些关键时刻添加自定义逻辑,确保你的应用程序能够正确地启动并运行。
  2. 数据预处理:在应用启动时,你可能需要进行数据预处理,例如清理上一次运行遗留的垃圾数据或者将常用的数据加载到内存中。通过实现 CommandLineRunner 或 ApplicationRunner 接口,你可以在应用启动后执行这些任务。
  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)使用 ApplicationRunner 或 CommandLineRunner 接口

虽然这不是严格意义上的监听器,但 ApplicationRunner 和 CommandLineRunner 接口提供了一种在应用启动后执行代码的方法。这两个接口非常相似,唯一的区别是 CommandLineRunner 的 run 方法接收一个字符串数组作为参数,而 ApplicationRunner 的 run 方法接收一个 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 已经被创建,但还没有调用任何 CommandLineRunner 或 ApplicationRunner
  • 此时,应用已经启动,但可能还没有准备好处理请求。

5)ApplicationReadyEvent

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

6)ApplicationFailedEvent

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

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

拓展:Springboot 项目启动、关闭 的监听

想在项目启动或是关闭的时候, 做些事情。

例如启动时,打印输出 “你好” , 关闭时,打印输出 “再见”。 

示例:

其实方式很多,但是我推荐 根据官方白皮的建议做。

白皮链接

启动的监听:

 如果需要在SpringApplication启动后运行某些特定代码,可以实现ApplicationRunner或CommandLineRunner接口。两个接口以相同的方式工作,并提供一个单独的运行方法,该方法在SpringApplication.run(…​) 完成。

关闭的监听: 

每个SpringApplication都向JVM注册一个关闭挂钩,以确保ApplicationContext在退出时正常关闭。可以使用所有标准的Spring生命周期回调(如DisposableBean接口或@PreDestroy注释)。

示例使用代码:

StandGuard.jav

import org.springframework.beans.factory.DisposableBean;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
 
@Component
public class StandGuard  implements ApplicationRunner, DisposableBean {
    @Override
    public void run(ApplicationArguments args) {
        System.out.println("你好。");
    }
    @Override
    public void destroy() {
        System.out.println("再见!");
    }
}

效果:

以上就是SpringBoot应用程序启动监听功能的常见方法的详细内容,更多关于SpringBoot应用启动监听的资料请关注脚本之家其它相关文章!

相关文章

  • Mybatis基于注解形式的sql语句生成实例代码

    Mybatis基于注解形式的sql语句生成实例代码

    这篇文章主要介绍了 Mybatis基于注解形式的sql语句生成实例代码,需要的朋友可以参考下
    2017-09-09
  • 在 Spring Boot 中使用 Quartz 调度作业的示例详解

    在 Spring Boot 中使用 Quartz 调度作业的示例详解

    这篇文章主要介绍了在 Spring Boot 中使用 Quartz 调度作业的示例详解,在本文中,我们将看看如何使用Quartz框架来调度任务,Quartz支持在特定时间运行作业、重复作业执行、将作业存储在数据库中以及Spring集成,需要的朋友可以参考下
    2022-07-07
  • 并发编程模式之ThreadLocal源码和图文解读

    并发编程模式之ThreadLocal源码和图文解读

    这篇文章主要介绍了并发编程模式之ThreadLocal源码和图文解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Mybatis-Plus实现公共字段自动赋值的方法

    Mybatis-Plus实现公共字段自动赋值的方法

    这篇文章主要介绍了Mybatis-Plus实现公共字段自动赋值的方法,涉及到通用字段自动填充的最佳实践总结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 使用springboot activiti关闭验证自动部署方式

    使用springboot activiti关闭验证自动部署方式

    这篇文章主要介绍了使用springboot activiti关闭验证自动部署方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Intellij无法创建java文件解决方案

    Intellij无法创建java文件解决方案

    这篇文章主要介绍了Intellij无法创建java文件解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java快速排序的实现方法示例

    Java快速排序的实现方法示例

    快速排序是对冒泡排序的一种改进,下面这篇文章主要给大家介绍了关于Java快速排序的实现方法,文中通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-03-03
  • java实现树形菜单对象

    java实现树形菜单对象

    这篇文章主要为大家详细介绍了java实现树形菜单对象,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • SpringCloud OpenFeign超时控制示例详解

    SpringCloud OpenFeign超时控制示例详解

    在Spring Cloud中使用OpenFeign时,可以通过配置来控制请求的超时时间,这篇文章主要介绍了SpringCloud OpenFeign超时控制,需要的朋友可以参考下
    2024-05-05
  • jvm细节探索之synchronized及实现问题分析

    jvm细节探索之synchronized及实现问题分析

    这篇文章主要介绍了jvm细节探索之synchronized及实现问题分析,涉及synchronized的字节码表示,JVM中锁的优化,对象头的介绍等相关内容,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11

最新评论