一、 概述
在Spring Boot应用开发过程中,我们经常需要在应用启动完成后执行一些特定的操作或输出启动信息。本文将介绍两种常用的实现方式:ApplicationListener 和 ApplicationRunner。
二、 使用 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("✅✅✅✅✅✅✅✅✅✅✅✅");
六、 最佳实践建议
- 合理选择实现方式 :根据具体需求选择
ApplicationListener或ApplicationRunner - 避免耗时操作:启动后逻辑应尽量简洁,避免影响应用启动时间
- 错误处理:对启动后执行的逻辑添加适当的异常处理
- 日志记录:使用合适的日志级别记录启动信息
七、总结
通过 ApplicationListener 和 ApplicationRunner,我们可以灵活地在Spring Boot应用启动完成后执行各种操作。前者更适合事件驱动的场景,后者更适合执行具体的启动后业务逻辑。根据实际需求选择合适的方式,能够有效提升应用的可维护性和用户体验。