Spring Boot CommandLineRunner和ApplicationRunner

在本快速教程中,我们将探索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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值