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应用启动完成后执行各种操作。前者更适合事件驱动的场景,后者更适合执行具体的启动后业务逻辑。根据实际需求选择合适的方式,能够有效提升应用的可维护性和用户体验。

相关推荐
真恋寄语枫秋15 小时前
【Java零基础入门20】Java Stream流超全详解:中间操作、终结操作、集合数据处理
java
段ヤシ.15 小时前
回顾Java知识点,面试题汇总Day10(持续更新)
java·开发语言·spring
Dicky-_-zhang15 小时前
Elasticsearch聚合查询优化实战
java·jvm
淼淼爱喝水15 小时前
【Ansible 入门实战】三种变量详解
java·linux·数据库·ansible·playbook
Perry 12315 小时前
Java中的多态
java·开发语言
asdfg125896315 小时前
一文理解软件开发中的“设计模式”
java·设计模式·软件开发
hikktn15 小时前
企业级Spring Boot应用管理:从零打造生产级启动脚本
java·spring boot·后端
砍材农夫15 小时前
物联网 基于netty构建mqtt协议规范(三种 QoS 等级)
java·开发语言·物联网
NiceCloud喜云15 小时前
Claude API 流式输出(SSE)实战:从打字机效果到工具调用全流程
java·前端·ide·人工智能·chrome·intellij-idea·状态模式
甲方大人请饶命15 小时前
Java-IO流
java·开发语言