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

相关推荐
咖啡八杯1 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育2 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
掘金码甲哥2 小时前
这块终端神器, 必须吹爆!
后端
糖果店的幽灵2 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
Csvn3 小时前
📊 SQL 入门 Day 8:集合操作 — 用 SQL 做数学里的"并交差"
后端·sql
腻害兔3 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影4 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao121315 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔5 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
码事漫谈5 小时前
告别数据孤岛与AI“水土不服”:金仓多模融合时序库如何让数据真正服务于业务
后端