zoukankan      html  css  js  c++  java
  • Spring boot CommandLineRunner接口使用例子

     

     CommandLineRunner和ApplicationRunner是Spring Boot所提供的接口,他们都有一个run()方法。所有实现他们的Bean都会在Spring Boot服务启动之后自动地被调用。

    前言

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

    如何使用CommandLineRunner接口

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

    1)和@Component注解一起使用

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

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

    2)和@SpringBootApplication注解一起使用

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

    @SpringBootApplication
    public class SpringBootWebApplication extends SpringBootServletInitializer implements CommandLineRunner {
     
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(SpringBootWebApplication.class);
        }
     
        public static void main(String[] args) throws Exception {
            SpringApplication.run(SpringBootWebApplication.class, args);
        }
     
     
        @Override
        public void run(String... args) throws Exception {
            logger.info("Application Started !!");
        }
    }
    

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

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

    ApplicationStartupRunner.java

    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

    @SpringBootApplication
    public class SpringBootWebApplication extends SpringBootServletInitializer {
     
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(SpringBootWebApplication.class);
        }
     
        public static void main(String[] args) throws Exception {
            SpringApplication.run(SpringBootWebApplication.class, args);
        }
     
        @Bean
        public ApplicationStartupRunner schedulerRunner() {
            return new ApplicationStartupRunner();
        }
    }
    

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

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

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

    @Order(value=3)
    @Component
    class ApplicationStartupRunnerOne implements CommandLineRunner {
        protected final Log logger = LogFactory.getLog(getClass());
     
        @Override
        public void run(String... args) throws Exception {
            logger.info("ApplicationStartupRunnerOne run method Started !!");
        }
    }
     
    @Order(value=2)
    @Component
    class ApplicationStartupRunnerTwo implements CommandLineRunner {
        protected final Log logger = LogFactory.getLog(getClass());
     
        @Override
        public void run(String... args) throws Exception {
            logger.info("ApplicationStartupRunnerTwo run method Started !!");
        }
    }
    

    输出日志:

    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


    @Author      风一样的码农
    @HomePageUrl http://www.cnblogs.com/chenpi/
    @Copyright      转载请注明出处,谢谢~
  • 相关阅读:
    linux网络编程之socket编程(三)
    linux网络编程之socket编程(二)
    字符串转成时间戳
    xls的读写
    统计词语频率保存到xls
    信息时代的学习(对于人类)
    编码格式简介:ASCII码、ANSI、GBK、GB2312、GB18030和Unicode、UTF-8,BOM头
    ThinkPHP中:RBAC权限控制的实习步骤
    getField()和select()方法的区别
    按钮美化,变化显示效果
  • 原文地址:https://www.cnblogs.com/zhuo-zui/p/13753087.html
Copyright © 2011-2022 走看看