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

相关推荐
掘金者阿豪6 小时前
关系数据库迁移的“暗礁”:金仓数据库如何规避数据完整性与一致性风险
后端
ServBay6 小时前
一个下午,一台电脑,终结你 90% 的 Symfony 重复劳动
后端·php·symfony
sino爱学习6 小时前
高性能线程池实践:Dubbo EagerThreadPool 设计与应用
java·后端
颜酱7 小时前
从二叉树到衍生结构:5种高频树结构原理+解析
javascript·后端·算法
掘金者阿豪7 小时前
UUID的隐形成本:一个让数据库“慢下来”的陷阱
后端
用户084465256377 小时前
Docker 部署 MongoDB Atlas 到服务端
后端
风生u7 小时前
activiti7 详解
java
岁岁种桃花儿7 小时前
SpringCloud从入门到上天:Nacos做微服务注册中心(二)
java·spring cloud·微服务
Word码7 小时前
[C++语法] 继承 (用法详解)
java·jvm·c++
TT哇7 小时前
【实习 】银行经理端两个核心功能的开发与修复(银行经理绑定逻辑修复和线下领取扫码功能开发)
java·vue.js