1.7分钟学会Spring Boot的CommandLineRunner

本文介绍一个非常酷的Spring Boot接口,名字叫做CommandLineRunner。

使用这个接口,你可以在Spring的Bean们以及Application Context被创建之后,来做一些事情。也就是在程序启动的时候做一些事情。

来自Spring Boot 文档

If you want access to the raw command line arguments, or you need to run some specific code once the SpringApplication has started you can implement the CommandLineRunner interface. The run(String… args) method will be called on all Spring beans implementing this interface. You can additionally implement the @Ordered interface if several CommandLineRunner beans are defined that must be called in a specific order.

如果要访问raw命令行参数,或者在SpringApplication启动后需要运行一些特定代码,可以实现 CommandLineRunner接口。 run(String ... args)方法将在实现此接口的所有Spring bean上调用。 如果你定义了多个 CommandLineRunner bean必须按特定顺序调用的话,那么你可以再实现一个接口@Ordered就可以了。

下面是一个来自NixMash Spring简单的例子:

@Component
public class ApplicationLoader implements CommandLineRunner {

    private static final Logger logger = LoggerFactory.getLogger(ApplicationLoader.class);

    @Override
    public void run(String... strings) throws Exception {
        StringBuilder sb = new StringBuilder();
        for (String option : strings) {
            sb.append(" ").append(option);
        }
        sb = sb.length() == 0 ? sb.append("No Options Specified") : sb;
        logger.info(String.format("WAR launched with following options: %s", sb.toString()));
    }
}

这是一个有点多余的小函数,只是记录一下在命令行启动WAR文件时使用的命令行参数。

有趣的是,上面的 ApplicationLoader类是在NixMash Spring JPA RootContext模块中,但是MVC WebContext模块中的 @SpringBootApplication将拾取该类,因为我们添加了 @Component注释并实现了 CommandLineRunner接口。

下面是从命令行启动的一个示例:

$ java -jar nixmashSpring.war --spring.one=one --spring.two=two

启动后,就可以看到输出了我们runner里边打印的内容,在第三行:

当然在实际的开发中,你通常想要使用 CommandLineRunner做比我们在这里做的更多的事。比如,你可以使用该接口注入Spring Cloud Zuul的filter。 你也可以使用 CommandLineRunner的另外一个实现 JobLauncherCommandLineRunner,通过这个接口你可以在Spring Batch中运行批处理作业。

总之,你要记住CommandLineRunner!

原文发布于微信公众号 - ImportSource(importsource)

原文发表时间:2017-01-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

Spring Boot 主类及目录结构介绍

Spring Boot 与传统项目最大的区别是,传统项目都是打成 WAR 包部署到服务器上面,需要额外的 Servlet 容器, 而 Spring Boot 则...

2712
来自专栏nummy

flume RPC 接口开发

2054
来自专栏happyJared

Spring Boot中初始化资源的几种方式

  假设有这么一个需求,要求在项目启动过程中,完成线程池的初始化,加密证书加载等功能,你会怎么做?如果没想好答案,请接着往下看。今天介绍几种在Spring Bo...

1852
来自专栏osc同步分享

注解 springMVC

web.xml中配置servlet <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="htt...

35010
来自专栏Android 研究

Android跨进程通信IPC之5——Binder的三大接口

本片文章的主要目的是让大家对Binder有个初步的了解,既然是初步了解,肯定所是以源码上的注释为主,让大家对Binder有一个更直观的认识。PS:大部分注释我是...

1555
来自专栏Ryan Miao

Spring-Boot - 初步搭建

official document:http://projects.spring.io/spring-boot/ 项目代码: https://github.co...

2674
来自专栏用户2442861的专栏

CMake使用总结

CMake意为cross-platform make,可用于管理c/c++工程。CMake解析配置文件CMakeLists.txt生成Makefile,相比直...

1101
来自专栏一个会写诗的程序员的博客

使用 Java REPLJava REPL

https://github.com/albertlatacz/java-repl/releases

682
来自专栏玩转JavaEE

Spring Cloud中声明式服务调用Feign

前面几篇文章我们详细的介绍了Ribbon、RestTemplate、Hystrix组件,这些组件是我们Spring Cloud中非常基础的组件,小伙伴们在使用的...

77011
来自专栏一个会写诗的程序员的博客

SpringBoot集成日志logback.groovy报错: Groovy classes are not available on the class path. ABORTING INITIAL

SpringBoot集成日志logback.groovy报错: Groovy classes are not available on the class pa...

1043

扫码关注云+社区

领取腾讯云代金券