Spring Boot 应用启动成功后的事件监听与日志输出实践

一、 概述

在Spring Boot应用开发过程中,我们经常需要在应用启动完成后执行一些特定的操作或输出启动信息。本文将介绍两种常用的实现方式:ApplicationListenerApplicationRunner

二、 使用 ApplicationListener 监听应用就绪事件

2.1 实现方式

java 复制代码
@Component
public class AppReadyListener implements ApplicationListener<ApplicationReadyEvent> {
    @Override
    public void onApplicationEvent(@NotNull ApplicationReadyEvent event) {
        LoggerFactory.getLogger(AppReadyListener.class).info("✅✅✅✅✅✅✅✅✅✅✅✅");
    }
}

2.2 特点分析

  • 监听事件ApplicationReadyEvent
  • 实现接口ApplicationListener<ApplicationReadyEvent>
  • 触发时机:应用完全启动并准备好接收请求时
  • 使用注解@Component 注册为Spring组件
  • 应用场景:适合在应用启动后执行初始化操作或输出状态信息

三、使用 ApplicationRunner 实现启动后逻辑

3.1 实现方式

java 复制代码
@Slf4j
@AllArgsConstructor
public class Knife4jDocUrlPrintHandler implements ApplicationRunner {

    private final ConfigurableEnvironment environment;

    @Override
    public void run(ApplicationArguments args) {
        log.info("API Document: 【address】:{}{}/doc.html", 
            environment.getProperty("server.port", "8080"), 
            environment.getProperty("server.servlet.context-path", ""));
    }
}

3.2 特点分析

  • 实现接口ApplicationRunner
  • 触发时机:应用启动完成后立即执行
  • 参数获取 :可以通过 ApplicationArguments 获取启动参数
  • 依赖注入 :可以方便地注入其他Bean(如这里的 ConfigurableEnvironment
  • 应用场景:适合输出应用配置信息、API文档地址等

四、 两种方式的对比

特性 ApplicationListener ApplicationRunner
监听机制 监听特定事件 在应用启动后运行
参数访问 通过事件对象获取 可直接获取ApplicationArguments
执行顺序 在ApplicationRunner之后 优先执行
适用场景 通用事件处理 启动后具体业务逻辑

五、 实际应用示例

5.1 输出API文档地址

java 复制代码
log.info("API Document: 【address】:{}{}/doc.html", 
    environment.getProperty("server.port", "8080"), 
    environment.getProperty("server.servlet.context-path", ""));

5.2 显示应用启动完成标识

java 复制代码
LoggerFactory.getLogger(AppReadyListener.class).info("✅✅✅✅✅✅✅✅✅✅✅✅");

六、 最佳实践建议

  1. 合理选择实现方式 :根据具体需求选择 ApplicationListenerApplicationRunner
  2. 避免耗时操作:启动后逻辑应尽量简洁,避免影响应用启动时间
  3. 错误处理:对启动后执行的逻辑添加适当的异常处理
  4. 日志记录:使用合适的日志级别记录启动信息

七、总结

通过 ApplicationListenerApplicationRunner,我们可以灵活地在Spring Boot应用启动完成后执行各种操作。前者更适合事件驱动的场景,后者更适合执行具体的启动后业务逻辑。根据实际需求选择合适的方式,能够有效提升应用的可维护性和用户体验。

相关推荐
再写一行代码就下班18 小时前
Cursor配置Java环境、创建Spring Boot项目的步骤
java·开发语言·spring boot
摇滚侠18 小时前
Java 零基础全套教程,类的加载过程与类加载器的理解,笔记 189
java·后端·intellij-idea
ServBay18 小时前
为什么我劝你不要在Mac上用Docker 进行本地 AI 开发
后端
蝎子莱莱爱打怪18 小时前
XZLL-IM干货系列 02|Protobuf 协议设计:从 JSON 切到二进制,每条消息省了 60%
后端·面试·架构
程序员黑豆18 小时前
AI全栈开发之Java:第一个Java程序
前端·后端·ai编程
kong@react18 小时前
Rocky Linux 10.2 全面解析:企业级 CentOS 替代方案及保姆级docker安装
java·linux·运维·docker
小Q的编程笔记18 小时前
Pump.fun 的核心是什么?用 300 行 Solidity 实现 Bonding Curve 与自动 LP 销毁
前端·后端·智能合约
学以智用18 小时前
.NET Core Swagger 超详细讲解(从入门到企业级)
后端·.net
未若君雅裁18 小时前
JVM 运行时数据区:程序计数器、堆、虚拟机栈与栈帧
java·jvm
浮游本尊19 小时前
Java学习第40天 - 数据库基础、表设计与 Spring Boot 数据访问入门
后端