在本快速教程中,我们将探索Spring Boot中两个非常流行的界面: CommandLineRunner和ApplicationRunner 。
这些接口的一种常见用例是在应用程序启动时加载一些静态数据。 虽然,我看到这种用法主要用于测试数据设置。
它们都是带有run()方法的功能接口。 此Run()方法在ApplicationContext加载之后和SpringApplication#run方法执行结束之前立即执行。
我们可以在CommandLineRunner的run()方法中以原始String的形式访问应用程序参数。
让我们借助示例来看看。
首先,让我们编写一个实现CommandLineRunner接口的bean:
@Component public class SampleCmdRunner implements CommandLineRunner {
private static final Logger LOG = LoggerFactory.getLogger(SampleCmdRunner. class );
@Override
public void run(String[] args) {
LOG.info( "Executing the command line runner, Application arguments: " + Arrays.toString(args));
} }
现在,让我们引导我们的Spring Boot应用程序可执行jar :
java -jar SampleApp- 1.0 .jar parameter1 parameter2 parameter3
以及三个命令行参数: parameter1,parameter2和parameter3 。
我们的控制台日志将是:
sbcetTomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) Executing the command line runner, Application arguments: [parameter1, parameter2, parameter3] 2019 - 09 - 02 11 : 02 : 10.111 INFO 7676 --- [main] com.programmergirl.SampleApp : Started SampleApp in 2.11 seconds
列出所有提供的参数的位置。
类似地,我们可以定义实现ApplicationRunner接口的bean:
@Component public class SampleAppRunner implements ApplicationRunner {
private static final Logger LOG = LoggerFactory.getLogger(SampleAppRunner. class );
@Override
public void run(ApplicationArguments args) {
LOG.info( "Executing SampleAppRunner" );
} }
ApplicationRunner提供对ApplicationArguments的访问,而不仅仅是原始String参数。 从技术上来讲,这是它们之间的唯一区别。
有多少
我们可以根据需要*定义任意数量的CommandLineRunner和ApplicationRunner实现。
Java 8定义:
使用Java 8 lambda, 我们可以有一个代码:
@SpringBootApplication public class SampleApp {
public static void main(String[] args) {
SpringApplication.run(SampleApp. class , args);
}
@Bean
CommandLineRunner commandLineRunner() {
return args ->
System.out.println( "CommandLineRunner with args:"
+ Arrays.toString(args));
}
@Bean
ApplicationRunner applicationRunner() {
return args ->
System.out.println( "ApplicationRunner with args:"
+ Arrays.toString(args.getSourceArgs()))
} }
在我们的Application类本身中定义了这些接口的实现。
订购:
我们还可以使用@Order注释对这些bean的执行施加顺序。
说,我们有两个CommandLineRunner实现:
@Component @Order ( 1 ) public class CmdRunner1 implements CommandLineRunner {
private static final Logger LOG = LoggerFactory.getLogger(CmdRunner1. class );
@Override
public void run(String[] args) {
LOG.info( "In CmdRunner1" );
} } @Component @Order ( 3 ) public class CmdRunner2 implements CommandLineRunner {
private static final Logger LOG = LoggerFactory.getLogger(CmdRunner2. class );
@Override
public void run(String[] args) {
LOG.info( "In CmdRunner2" );
} }
连同实现ApplicationRunner的类:
@Component @Order ( 2 ) public class AppRunner implements ApplicationRunner {
private static final Logger LOG = LoggerFactory.getLogger(AppRunner. class );
@Override
public void run(ApplicationArguments args) {
LOG.info( "In AppRunner" );
} }
显然,我们的CmdRunner1将首先执行,然后是AppRunner ,最后是CmdRunner2。
结论:
在本教程中,我们讨论了Spring Boot提供的CommandLineRunner和ApplicationRunner接口。
翻译自: https://www.javacodegeeks.com/2019/09/spring-boot-commandlinerunner-and-applicationrunner.html