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