欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Boot CommandLineRunner和ApplicationRunner

程序员文章站 2022-03-02 17:32:37
...

在本快速教程中,我们将探索Spring Boot中两个非常流行的界面: CommandLineRunnerApplicationRunner

这些接口的一种常见用例是在应用程序启动时加载一些静态数据。 虽然,我看到这种用法主要用于测试数据设置。

它们都是带有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,parameter2parameter3

我们的控制台日志将是:

 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参数。 技术上来讲,这是它们之间的唯一区别。

有多少

我们可以根据需要*定义任意数量的CommandLineRunnerApplicationRunner实现。

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提供的CommandLineRunnerApplicationRunner接口。

翻译自: https://www.javacodegeeks.com/2019/09/spring-boot-commandlinerunner-and-applicationrunner.html