在SpringBoot启动时执行特定代码的常见方法小结

 更新时间:2025年08月19日 09:31:17   作者:yifanghub  
本文总结了SpringBoot启动时执行代码的5种方法,涵盖@PostConstruct、CommandLineRunner、ApplicationRunner、ApplicationListener及@EventListener,各方法适用于不同场景,需要的朋友可以参考下

在SpringBoot的项目中,经常会遇到需要在项目启动后执行一些操作的情形,如加载配置,初始化数据,缓存预热等,本文整理了几种常见的在项目启动时执行特定代码的方法。

1.使用 @PostConstruct 注解

@Slf4j
@Component
public class MyInit {

    @PostConstruct
    public void init() {
        log.info("PostConstruct initialized~~~");
    }

}

优点:

  • 简单直接:只需在方法上添加 @PostConstruct 注解,方法会在Bean初始化后立即执行。
  • 灵活性高:可以在任何Bean中使用,适合对特定Bean进行初始化逻辑。

缺点:

  • 无法控制执行顺序:多个 @PostConstruct 方法的执行顺序不可控。
  • 不适合复杂启动逻辑:在Bean初始化完成后执行,但此时可能其他Bean尚未完全初始化完成,不适合依赖其他Bean的复杂场景。

2.使用 CommandLineRunner 接口

CommandLineRunner 接口提供了一个 run 方法,该方法会在Spring Boot应用启动后执行。

@Component
@Slf4j
public class MyCommandLineRunner implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        log.info("MyStartupRunner CommandLineRunner initialized~~~");
    }
}

优点:

  • 简单易用:实现 CommandLineRunner 接口并重写 run 方法即可。
  • 适合处理命令行参数:可以直接访问命令行参数(String… args)。
  • 顺序可控:可以通过 @Order 注解或实现 Ordered 接口来控制多个 CommandLineRunner 的执行顺序。

缺点:

  • 执行时机较早:在Spring应用上下文刷新完成后执行,但此时可能某些Bean尚未完全初始化完成,不适合依赖某些复杂Bean的场景。

3.使用 ApplicationRunner 接口

ApplicationRunner 接口与 CommandLineRunner 类似,但它提供了更丰富的 ApplicationArguments 参数来处理命令行参数。

@Slf4j
@Component
public class MyApplicationRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        log.info("MyApplicationRunner initialized~~~");
    }
}

优点:

  • 更强大的参数处理:提供了 ApplicationArguments 对象,可以更方便地解析命令行参数(如 --key=value 格式)。
  • 顺序可控:同样可以通过 @Order 注解或实现 Ordered 接口来控制执行顺序。

缺点:

  • 执行时机较早:与CommandLineRunner类似,可能某些Bean尚未完全初始化完成,不适合依赖某些复杂Bean的场景。

4.使用 ApplicationListener 监听 ApplicationReadyEvent

@Component
@Slf4j
public class MyApplicationListener implements ApplicationListener<ApplicationReadyEvent> {
    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        log.info("MyApplicationListener initialized~~~");
    }
}

优点:

  • 确保应用完全启动ApplicationReadyEvent 是在应用完全启动后触发的,适合执行依赖其他Bean或外部资源的逻辑。
  • 灵活性强:可以监听其他Spring事件(如 ContextRefreshedEvent),适合更复杂的场景。

缺点:

  • 无法直接访问命令行参数:如果需要处理命令行参数,需要额外处理。

5.@EventListener监听ApplicationReadyEvent

可以使用 @EventListener 注解来监听 ApplicationReadyEvent 事件

@Component
@Slf4j
public class MyEventListener {
    @EventListener(ApplicationReadyEvent.class)
    public void onApplicationReady() {
        log.info("MyEventListener initialized~~~");
    }
}

优点:

  • 简洁:使用注解方式监听事件,代码更简洁。
  • 确保应用完全启动:与 ApplicationListener 相同,适合在应用完全启动后执行逻辑。
  • 灵活性强:可以监听多个事件。

缺点:

  • 无法直接访问命令行参数:同样需要额外处理命令行参数。
  • 执行顺序不可控:多个监听器的执行顺序不可控。

以上几种方式执行后日志打印如下:

[main] com.example.springdemo.init.MyInit       : PostConstruct initialized~~~
[main] c.e.springdemo.SpringDemoApplication     : Started SpringDemoApplication in 0.358 seconds (JVM running for 0.809)
[main] c.e.springdemo.init.MyApplicationRunner  : MyApplicationRunner initialized~~~
[main] c.e.springdemo.init.MyCommandLineRunner  : CommandLineRunner initialized~~~
[main] c.e.s.init.MyApplicationListener         : MyApplicationListener initialized~~~
[main] c.e.springdemo.init.MyEventListener      : MyEventListener initialized~~~

总结

  • 如果需要处理命令行参数,优先选择 CommandLineRunnerApplicationRunner
  • 如果只是简单的Bean初始化逻辑,使用 @PostConstruct
  • 如果需要在应用完全启动后执行逻辑,选择 ApplicationListener@EventListener
  • 如果需要更灵活的事件监听机制,选择 ApplicationListener@EventListener

以上就是在SpringBoot启动时执行特定代码的常见方法小结的详细内容,更多关于SpringBoot启动执行特定代码的资料请关注脚本之家其它相关文章!

相关文章

  • 通过实例解析POJO和JavaBean的区别

    通过实例解析POJO和JavaBean的区别

    这篇文章主要介绍了通过实例解析POJO和JavaBean的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Spring Boot Logging Level设置为off时的Bug

    Spring Boot Logging Level设置为off时的Bug

    这篇文章主要介绍了Spring Boot Logging Level设置为off时的Bug,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • mybatis-plus使用generator实现逆向工程

    mybatis-plus使用generator实现逆向工程

    mybatis-plus-generator在3.5.0以及以后的版本使用新的方式逆向生成代码,本文主要介绍了mybatis-plus使用generator实现逆向工程,具有一定的参考价值,感兴趣的可以了解一下
    2022-05-05
  • java中的key接口解析

    java中的key接口解析

    这篇文章主要介绍了java中的key接口,有需要的朋友可以参考一下
    2014-01-01
  • 秒懂Kotlin之Java工程师快速掌握Kotlin的技巧

    秒懂Kotlin之Java工程师快速掌握Kotlin的技巧

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源。这篇文章主要介绍了秒懂Kotlin之Java工程师快速掌握Kotlin的技巧,需要的朋友可以参考下
    2021-09-09
  • SpringBoot3集成MyBatis详解

    SpringBoot3集成MyBatis详解

    MyBatis是一款开源的持久层框架,它极大地简化了与数据库的交互流程,MyBatis更具灵活性,允许开发者直接使用SQL语句与数据库进行交互,本文将详细介绍在Spring Boot项目中如何集成MyBatis,以实现对数据库的轻松访问和操作,需要的朋友可以参考下
    2023-12-12
  • Springboot服务实现执行SQL脚本文件

    Springboot服务实现执行SQL脚本文件

    这篇文章主要介绍了Springboot服务实现执行SQL脚本文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • SpringBoot集成Redis—使用RedisRepositories详解

    SpringBoot集成Redis—使用RedisRepositories详解

    这篇文章主要介绍了SpringBoot集成Redis—使用RedisRepositories详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • java合并list方法代码实例

    java合并list方法代码实例

    这篇文章主要介绍了java合并list方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java实现WGS84/百度/腾讯/高德等主流的地理坐标转换

    Java实现WGS84/百度/腾讯/高德等主流的地理坐标转换

    这篇文章主要为大家详细介绍了如何使用Java实现WGS84,百度,腾讯,高德等主流的地理坐标转换,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2025-12-12

最新评论