Spring boot CommandLineRunner接口使用例子

阅读目录#

前言#

Spring boot 的CommandLineRunner接口主要用于实现在应用初始化后,去执行一段代码块逻辑,这段初始化代码在整个应用生命周期内只会执行一次。

如何使用 CommandLineRunner 接口#

我们可以用以下三种方式去使用CommandLineRunner接口:

1)和 @Component 注解一起使用#

这种使用方式相当简便,如下所示:

Copy
@Component public class ApplicationStartupRunner implements CommandLineRunner { protected final Log logger = LogFactory.getLog(getClass());
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">run</span><span class="hljs-params">(String... args)</span> <span class="hljs-keyword">throws</span> Exception {
    logger.info(<span class="hljs-string">"ApplicationStartupRunner run method Started !!"</span>);
}

}

2)和 @SpringBootApplication 注解一起使用#

这种使用方式也相当的简单,参考代码如下:

Copy
@SpringBootApplication public class SpringBootWebApplication extends SpringBootServletInitializer implements CommandLineRunner {
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-type">SpringApplicationBuilder</span> configure(<span class="hljs-type">SpringApplicationBuilder</span> application) {
    <span class="hljs-keyword">return</span> application.sources(<span class="hljs-type">SpringBootWebApplication</span>.<span class="hljs-keyword">class</span>);
}

public static void main(<span class="hljs-type">String</span>[] args) <span class="hljs-keyword">throws</span> <span class="hljs-type">Exception</span> {
    <span class="hljs-type">SpringApplication</span>.run(<span class="hljs-type">SpringBootWebApplication</span>.<span class="hljs-keyword">class</span>, args);
}


<span class="hljs-meta">@Override</span>
public void run(<span class="hljs-type">String</span>... args) <span class="hljs-keyword">throws</span> <span class="hljs-type">Exception</span> {
    logger.info(<span class="hljs-string">"Application Started !!"</span>);
}

}

3) 声明一个实现了 CommandLineRunner 接口的 Bean#

这种方式其实也大同小异,就是在SpringBootApplication里定义一个 Bean,改 Bean 实现了CommandLineRunner接口,参考代码如下:

ApplicationStartupRunner.java

Copy
public class ApplicationStartupRunner implements CommandLineRunner { protected final Log logger = LogFactory.getLog(getClass()); @Override public void run(String... args) throws Exception { logger.info("Application Started !!"); } }

注册 ApplicationStartupRunner bean

Copy
@SpringBootApplication public class SpringBootWebApplication extends SpringBootServletInitializer {
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-type">SpringApplicationBuilder</span> configure(<span class="hljs-type">SpringApplicationBuilder</span> application) {
    <span class="hljs-keyword">return</span> application.sources(<span class="hljs-type">SpringBootWebApplication</span>.<span class="hljs-keyword">class</span>);
}

public static void main(<span class="hljs-type">String</span>[] args) <span class="hljs-keyword">throws</span> <span class="hljs-type">Exception</span> {
    <span class="hljs-type">SpringApplication</span>.run(<span class="hljs-type">SpringBootWebApplication</span>.<span class="hljs-keyword">class</span>, args);
}

<span class="hljs-meta">@Bean</span>
public <span class="hljs-type">ApplicationStartupRunner</span> schedulerRunner() {
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-type">ApplicationStartupRunner</span>();
}

}

注意:在实现CommandLineRunner接口时,run(String… args)方法内部如果抛异常的话,会直接导致应用启动失败,所以,一定要记得将危险的代码放在try-catch代码块里。

用 @Order 注解去设置多个 CommandLineRunner 实现类的执行顺序#

一个应用可能存在多个 CommandLineRunner接口实现类,如果我们想设置它们的执行顺序,可以使用 @Order实现

Copy
@Order(value=3) @Component class ApplicationStartupRunnerOne implements CommandLineRunner { protected final Log logger = LogFactory.getLog(getClass());
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">run</span><span class="hljs-params">(String... args)</span> <span class="hljs-keyword">throws</span> Exception {
    logger.info(<span class="hljs-string">"ApplicationStartupRunnerOne run method Started !!"</span>);
}

}

@Order(value=2)
@Component
class ApplicationStartupRunnerTwo implements CommandLineRunner {
protected final Log logger = LogFactory.getLog(getClass());

<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">run</span><span class="hljs-params">(String... args)</span> <span class="hljs-keyword">throws</span> Exception {
    logger.info(<span class="hljs-string">"ApplicationStartupRunnerTwo run method Started !!"</span>);
}

}

输出日志:

Copy
2017-03-08 13:55:04 - ApplicationStartupRunnerTwo run method Started !! 2017-03-08 13:55:04 - ApplicationStartupRunnerOne run method Started !!

为什么要使用 CommandLineRunner 接口#

  • 实现在应用启动后,去执行相关代码逻辑,且只会执行一次;
  • spring batch 批量处理框架依赖这些执行器去触发执行任务;
  • 我们可以在 run() 方法里使用任何依赖,因为它们已经初始化好了;

原文文链#

Site4J