解读CommandLineRunner或者ApplicationRunner接口

 更新时间:2023年02月13日 10:06:47   作者:二月_春风  
这篇文章主要介绍了解读CommandLineRunner或者ApplicationRunner接口的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

前言

CommandLineRunner、ApplicationRunner 接口是在容器启动成功后的最后一步回调(类似开机自启动)。

CommandLineRunner接口

CommandLineRunner

官方doc:

Interface used to indicate that a bean should run when it is contained within a SpringApplication. Multiple CommandLineRunner beans can be defined within the same application context and can be ordered using the Ordered interface or Order @Order annotation.

接口被用作将其加入spring容器中时执行其run方法。多个CommandLineRunner可以被同时执行在同一个spring上下文中并且执行顺序是以order注解的参数顺序一致。

If you need access to ApplicationArguments instead of the raw String array
consider using ApplicationRunner.

如果你需要访问ApplicationArguments去替换掉字符串数组,可以考虑使用ApplicationRunner类。

先看一个demo:

定义一个ServerStartedReport实现CommandLineRunner,并纳入到srping容器中进行处理

import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
 
import java.time.LocalDateTime;
 
@Component
public class ServerStartedReport implements CommandLineRunner{
    @Override
    public void run(String... args) throws Exception {
        System.out.println("===========ServerStartedReport启动====="+ LocalDateTime.now());
    }
}

定义一个ServerSuccessReport实现CommandLineRunner,并纳入到spring容器处理

import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
 
import java.util.Arrays;
 
@Order(1)
@Component
public class ServerSuccessReport implements CommandLineRunner{
    @Override
    public void run(String... args) throws Exception {
        System.out.println("=====应用已经成功启动====="+ Arrays.asList(args));
    }
}

启动类测试,也可以直接在spring容器访问该值,

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
 
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context =SpringApplication.run(Application.class,args);
        ApplicationArguments applicationArguments = context.getBean(ApplicationArguments.class);
        System.out.println("============");
        System.out.println("name="+applicationArguments.getOptionNames());
        System.out.println("values===="+applicationArguments.getOptionValues("developer.name"));
    }
}

配置参数,然后执行启动类

打印结果

ApplicationRunner接口

发现二者的官方javadoc一样,区别在于接收的参数不一样。CommandLineRunner的参数是最原始的参数,没有做任何处理。ApplicationRunner的参数是ApplicationArguments,是对原始参数做了进一步的封装。

ApplicationArguments是对参数(main方法)做了进一步的处理,可以解析--name=value的,我们就可以通过name来获取value(而CommandLineRunner只是获取--name=value)

可以接收--foo=bar这样的参数。

  • --getOptionNames()方法可以得到foo这样的key的集合。
  • --getOptionValues(String name)方法可以得到bar这样的集合的value。

看一个demo:

定义MyApplicationRunner类继承ApplicationRunner接口:

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
 
import java.util.Arrays;
 
@Component
public class MyApplicationRunner implements ApplicationRunner{
 
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("===MyApplicationRunner==="+ Arrays.asList(args.getSourceArgs()));
        System.out.println("===getOptionNames========"+args.getOptionNames());
        System.out.println("===getOptionValues======="+args.getOptionValues("foo"));
        System.out.println("==getOptionValues========"+args.getOptionValues("developer.name"));
    }
}

启动类:

import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

配置参数启动:

打印结果:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java实现队列的三种方法集合

    Java实现队列的三种方法集合

    这篇文章主要介绍了Java实现队列的三种方法集合,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • springboot配置resilience4j全过程

    springboot配置resilience4j全过程

    这篇文章主要介绍了springboot配置resilience4j全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • gson对象序列化的示例

    gson对象序列化的示例

    本文介绍如何将Java对象序列化为Json文件,然后读取该Json文件读取回Java对象。在下面的示例中,我们创建了一个Student类。然后生成一个student.json文件,该文件将具有Student对象的json数据。
    2020-11-11
  • java批量修改文件名的实现方法

    java批量修改文件名的实现方法

    这篇文章主要介绍了 java批量修改文件名的实现方法的相关资料,实现批量修改文件下的所有文件的文件名,具有一定的参考价值,需要的朋友可以参考下
    2017-07-07
  • SpringBoot实现指标监控

    SpringBoot实现指标监控

    这篇文章主要介绍了SpringBoot实现指标监控方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 关于Java中的mysql时区问题详解

    关于Java中的mysql时区问题详解

    这篇文章主要给大家介绍了关于Java中mysql时区问题的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05
  • RocketMQ消息重试机制原理分析讲解

    RocketMQ消息重试机制原理分析讲解

    这篇文章主要介绍了RocketMQ消息重试机制,消息的发送和消费并不是百分百成功的,在出现消息推送失败时,RocketMQ有何补偿方式来进行消息重试呢?这是我们今天要一起学习的点
    2023-02-02
  • Java连接Linux服务器过程分析(附代码)

    Java连接Linux服务器过程分析(附代码)

    这篇文章主要介绍了Java连接Linux服务器过程分析(附代码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java使用JDBC连接数据库的详细步骤

    Java使用JDBC连接数据库的详细步骤

    本文详细讲解了Java使用JDBC连接数据库的详细步骤,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • springboot整合Shiro的步骤

    springboot整合Shiro的步骤

    这篇文章主要介绍了springboot整合Shiro的步骤,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2021-01-01

最新评论