springboot之CommandLineRunner接口

2020-11-19 15:21:03 浏览数 (1)

springboot之CommandLineRunner接口

在这篇文章中,我们将讨论和探究springboot中的CommandLineRunner接口,将涉及这个接口的不同特性,以及何时使用这个接口。

介绍

springboot中的CommandLineRunner接口提供了在应用程序完全启动时运行特定代码段的方式,这个接口会在应用启动后被springboot自动调用。

1CommandLineRunner接口

@Component public class CustomCommandLineRunner implements CommandLineRunner { private static final Logger LOG = LoggerFactory.getLogger(CustomCommandLineRunner.class); @Override public void run(String...args) throws Exception { LOG.info("Custom command line runner is excuted with command line arguments: {}", Arrays.toString(args)); } }

CommandLineRunner接口只提供了一个运run方法,它在SpringApplication.run(...)方法执行完成之前被调用,如果运行应用,我们可以在服务器上看到如下日志:

2018-07-06 21:54:11.096 INFO 27045 --- [ main] c.j.SpringBootExampleApplication : Started SpringBootExampleApplication in 2.195 seconds (JVM running for 2.998) 2018-07-06 21:54:11.098 INFO 27045 --- [ main] c.j.commandline.CustomCommandLineRunner : Custom command line runner is excuted with command line arguments: []

2CommandLineRunner顺序

我们可以在应用程序中使用任意数量的CommandLineRunner,如果我们想要以特定的顺序调用我们的CommandLineRunner,我们有以下两种方式:

  • 实现 org.springframework.core.Ordered 接口
  • 使用 @Order 注解

2.1:使用Ordered接口排序

实现Ordered接口和getOrder()方法,为自定义运行程序提供优先级:

@Component public class CustomCommandLineRunner implements CommandLineRunner, Ordered { private static final Logger LOG = LoggerFactory.getLogger(CustomCommandLineRunner.class); @Override public void run(String...args) throws Exception { LOG.info("Custom command line runner is excuted with command line arguments: {}", Arrays.toString(args)); } @Override public int getOrder() { return 2; } }

2.2:使用@Order注解排序

使用@Order注解,为自定义运行程序提供优先权:

@Component @Order(1) public class CustomCommandLineRunner2 implements CommandLineRunner { private static final Logger LOG = LoggerFactory.getLogger(CustomCommandLineRunner2.class); @Override public void run(String...args) throws Exception { LOG.info("Calling second command line runner with arguments {}", Arrays.toString(args)); } }

如果运行我们的应用程序,则在服务器控制台上可以看到以下输出:

2018-07-06 22:03:13.906 INFO 27190 --- [ main] c.j.SpringBootExampleApplication : Started SpringBootExampleApplication in 1.811 seconds (JVM running for 2.555) 2018-07-06 22:03:13.907 INFO 27190 --- [ main] c.j.c.CustomCommandLineRunner2 : Calling second command line runner with arguments [] 2018-07-06 22:03:13.907 INFO 27190 --- [ main] c.j.commandline.CustomCommandLineRunner : Custom command line runner is excuted with command line arguments: [] Copy

数字越低,优先级越高。

3何时使用CommandLineRunner接口

在springboot应用中,CommandLineRunner接口是一个非常重要的工具,下面试CommandLineRunner接口的一些常用的应用场景:

  • 准备应用程序初始化数据
  • 来自外部依赖服务的源数据

总结

在这篇篇幅较短的文章中,我们探究了CommandLineRunner接口,介绍了CommandLineRunner接口的常用使用场景,以及根据应用的具体需求创建CommandLineRunner接口实例和设置优先级。

CommandLineRunner接口的作用和spring应用中的ApplicationContextAware接口类似,都是在应用启动之后做一些初始化动作。

0 人点赞