Java SpringBoot 项目,项目启动后执行的方法,有哪些方式实现

Java SpringBoot 项目,项目启动后执行的方法,有哪些方式实现

在 Spring Boot 项目中,有多种方式可以在应用启动后执行特定的初始化逻辑。选择哪种方式主要取决于你的具体需求,例如执行时机、是否需要处理参数、以及执行顺序等。

以下是几种主流的实现方式,按推荐程度和适用场景进行介绍。

🚀 推荐方式:Runner 接口

这是最常用和推荐的方式,适用于绝大多数在应用完全启动后执行初始化任务的场景。ApplicationRunnerCommandLineRunner 都会在 Spring Boot 应用的 ApplicationContext 完全初始化后执行。

  • ApplicationRunner : 参数处理更友好,支持 key=value 形式的参数解析。
  • CommandLineRunner : 接收原始的字符串数组 (String...) 参数,使用更简单。
java 复制代码
// 使用 ApplicationRunner
@Component
@Order(1) // 可以指定执行顺序,值越小越先执行
public class MyApplicationRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 你的初始化逻辑
        System.out.println("ApplicationRunner 执行了!");
    }
}

// 使用 CommandLineRunner
@Component
@Order(2)
public class MyCommandLineRunner implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        // 你的初始化逻辑
        System.out.println("CommandLineRunner 执行了!");
    }
}

🎯 推荐方式:监听就绪事件

如果你需要确保所有初始化工作(包括 Runner 接口)都完成后,再执行某个任务,监听 ApplicationReadyEvent 是最佳选择。这标志着应用已准备好,可以对外提供服务。

java 复制代码
@Component
public class MyApplicationReadyListener {
    
    @EventListener(ApplicationReadyEvent.class)
    public void onApplicationReady() {
        // 应用完全启动后执行
        System.out.println("应用已就绪,执行最终任务...");
    }
}

⏱️ 其他方式

以下方式虽然也能实现启动后执行,但执行时机更早,或有其他限制,需要根据场景谨慎选择。

方式 执行时机 主要特点
@PostConstruct Bean 创建并完成依赖注入后 执行非常早,会阻塞应用启动,不适合耗时长的任务。
InitializingBean Bean 的所有属性设置完成后 类似于 @PostConstruct,是接口形式,侵入性较强。
SmartInitializingSingleton 所有单例 Bean 实例化完成后 Runner 之前执行,可用于处理 Bean 初始化完成后的逻辑。
SmartLifecycle ApplicationContext 刷新完成后 可以控制启动和停止逻辑,适合管理后台线程等资源。
ServletContextAware Servlet 上下文初始化时 仅适用于 Web 应用,侵入性强,不推荐用于通用初始化。

⚖️ 如何选择

  • 通用初始化任务 :首选 ApplicationRunnerCommandLineRunner
  • 依赖所有初始化都完成 :选择监听 ApplicationReadyEvent
  • Bean 内部的简单初始化 :可以使用 @PostConstruct,但务必确保逻辑轻量。
  • 需要管理生命周期的后台任务 :考虑使用 SmartLifecycle

📜 执行顺序

当项目中存在多种方式时,它们的执行顺序大致如下(不考虑 @Order 注解的影响):

  1. @PostConstruct / InitializingBean (执行时机最早,穿插在 Bean 初始化过程中)
  2. SmartInitializingSingleton
  3. ApplicationRunner / CommandLineRunner
  4. ApplicationReadyEvent (执行时机最晚,标志着应用启动完成)

了解这些方式的区别和执行顺序,可以帮助你更好地组织和控制 Spring Boot 应用的启动流程。

相关推荐
aP8PfmxS23 分钟前
Lab3-page tables && MIT6.1810操作系统工程【持续更新】
java·linux·jvm
无籽西瓜a4 分钟前
【西瓜带你学设计模式 | 第十二期 - 装饰器模式】装饰器模式 —— 动态叠加功能实现、优缺点与适用场景
java·后端·设计模式·软件工程·装饰器模式
吴声子夜歌5 分钟前
Node.js——zlib压缩模块
java·spring·node.js
海参崴-5 分钟前
深入剖析C语言结构体存储规则:内存对齐原理与实战详解
java·c语言·开发语言
南山乐只6 分钟前
Java并发工具:synchronized演进,从JDK 1.6 锁升级到 JDK 24 重构
java·开发语言·后端·职场和发展
无籽西瓜a8 分钟前
【西瓜带你学设计模式 | 第十三期 - 组合模式】组合模式 —— 树形结构统一处理实现、优缺点与适用场景
java·后端·设计模式·组合模式·软件工程
翊谦8 小时前
Java Agent开发 Milvus 向量数据库安装
java·数据库·milvus
晓晓hh9 小时前
JavaSE学习——迭代器
java·开发语言·学习
Laurence9 小时前
C++ 引入第三方库(一):直接引入源文件
开发语言·c++·第三方库·添加·添加库·添加包·源文件
查古穆9 小时前
栈-有效的括号
java·数据结构·算法