Spring Boot CommandLineRunner


晴天?霹雳
2025-04-08 02:36:05 (6小时前)
  1. 在什么情况下首选CommandLineRunner而不是在main方法中编写其他代码


SpringBoot
</跨度>
应用。

我知道CommandLineRunner会在main完成之前执行。

8 条回复
  1. 0# 仙风道骨刘憨憨 | 2019-08-31 10-32



    我用它来解耦代码。 CommandLineRunner不是将一堆代码放入main方法,而是让您在代码库周围更均匀地分发它。这实际上取决于你传递的是什么样的标志以及为什么需要传递它们.Spring为你提供了很大的灵活性,让你以最简单的方式完成工作。



    对于完整的命令行工具,您可以通过在init和核心行为之间划分代码来分离初始化和配置。



    Spring引导服务器可以根据从命令行传入的args覆盖配置。


  2. 1# 無口君 | 2019-08-31 10-32




    ApplicationRunner
    </强>


    CommandLineRunner
    </强>

    其中两个可以在应用程序完成启动之前执行一些自定义代码。




    ComandLineRunner:
    </强>




    1. @Component
      public class CommandLineAppStartupRunner implements CommandLineRunner {
      private static final Logger logger = LoggerFactory.getLogger(CommandLineAppStartupRunner.class);
      @Override
      public void run(Stringargs) throws Exception {
      logger.info(Arrays.toString(args));
      }
      }

    2. </code>


    你可以直接得到args




    ApplicationRunner
    </强>
    锛歕[R




    1. @Component
      public class AppStartupRunner implements ApplicationRunner {
      private static final Logger logger = LoggerFactory.getLogger(AppStartupRunner.class);
      @Override
      public void run(ApplicationArguments args) throws Exception {
      logger.info(args.getOptionNames());
      }
      }

    2. </code>


    ApplicationRunner有很多方法可以获得params
    ComandLineRunner可以直接获得params



    如果您自定义了两个运行程序类,则可以使用注释@Order指定执行顺序


  3. 2# 无思 | 2019-08-31 10-32



    我用它来填充我的默认数据。我经常创造

    ApplicationInitializer

    扩展的类

    CommandLineRunner


    我有类似的方法

    createDefaultUser()



    createDefaultSytemData()

    等等
    这种方式我不依赖

    sql

    文件为我填充数据库。 :)


  4. 3# 甲基蓝 | 2019-08-31 10-32



    我遇到了一个场景,在第一次从控制器端点命中方法之前,我必须保留加载到缓存中的数据库中的某些数据。在这种情况下,需要在扩展CommandLineRunner类之后使用run方法命中填充缓存的方法,以便在应用程序启动之前,数据已在缓存中可用。


  5. 4# 明月清风上善若水自由如风 | 2019-08-31 10-32



    我建议所有的时间。它为您的“引导代码”增加了很多灵活性。



    1)例如,命令行运行程序是spring @Beans,因此您可以在运行时激活/停用它们。



    2)您可以通过附加@Order注释以有序的方式使用它们



    3)你可以像普通课一样对它们进行单元测试



    4)您可以将依赖项注入其中。然后每个跑步者可以拥有自己的依赖关系。



    如果在Spring Application类的main()方法中添加所有引导逻辑,如果不是不可能实现上述所有内容则更加困难。



    希望我的回答有所帮助
    干杯


  6. 5# v-star*위위 | 2019-08-31 10-32



    在简单的情况下,没有区别。



    但是,如果代码需要访问spring提供的功能,例如ioc或只有接口存储库/服务,则需要等待完整的应用程序启动。并且保证了完成后的超控运行方法的调用。



    此外,CommandLineRunner还有其他优点:




    • 可以多次实现


    • 在应用程序开始运行之前启动任何调度程序或记录任何消息的功能


登录 后才能参与评论