【SpringBoot】中的ApplicationRunner接口 和 CommandLineRunner接口

这篇具有很好参考价值的文章主要介绍了【SpringBoot】中的ApplicationRunner接口 和 CommandLineRunner接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. ApplicationRunner接口

用法:

  • 类型: 接口

  • 方法: 只定义了一个run方法

  • 使用场景: springBoot项目启动时,若想在启动之后直接执行某一段代码,就可以用 ApplicationRunner这个接口,并实现接口里面的run(ApplicationArguments args)方法,方法中写上自己的代码逻辑。也就是:spring容器启动完成之后,就会紧接着执行这个接口实现类的run方法。

  • run方法的参数: ApplicationArguments可以获取到当前项目执行的命令参数。(比如把这个项目打成jar执行的时候,带的参数可以通过ApplicationArguments获取到);

@Component  //此类一定要交给spring管理
public class ConsumerRunner implements ApplicationRunner{
     @Override
     public void run(ApplicationArgumers args) throws Exception{
        //代码
        System.out.println("需要在springBoot项目启动时执行的代码---");
     }
}

若有多个代码段需要执行,可用@Order注解设置执行的顺序。

在同一个项目中,可以定义多个ApplicationRunner的实现类,他们的执行顺序通过注解@Order注解或者再实现Ordered接口来实现。
@Order注解: 如果有多个实现类,而你需要他们按一定顺序执行的话,可以在实现类上加上@Order注解。@Order(value=整数值)。SpringBoot会按照@Order中的value值从小到大依次执行。

@order, 使用注解方式使bean的加载顺序得到控制;@Order标记定义了组件的加载顺序,值越小拥有越高的优先级,可为负数。值越小,越先被加载。
@Order(-1) 优先于 @Order(0)
@Order(1) 优先于 @Order(2)

@Component  //此类一定要交给spring管理
@Order(value=1) //首先执行
public class ConsumerRunnerA implements ApplicationRunner{
    @Override
    public void run(ApplicationArgumers args) throws Exception{
        //代码
        System.out.println("需要在springBoot项目启动时执行的代码1---");
    }
}
@Component  //此类一定要交给spring管理
@Order(value=2) //其次执行
public class ConsumerRunnerB implements ApplicationRunner{
    @Override
    public void run(ApplicationArgumers args) throws Exception{
        //代码
        System.out.println("需要在springBoot项目启动时执行的代码2---");
    }
}

@Component注解: 将类注入到spring容器中。

参考链接:https://blog.csdn.net/hc1285653662/article/details/122445495

2. CommandLineRunner接口

用法:

在容器启动成功后的最后一步回调(类似开机自启动)
写一个类,实现CommandLineRunner接口,将该类注入到Spring容器中;

可以通过@Order注解(属性指定数字越小表示优先级越高)或者Ordered接口来控制执行顺序。

EX:自定义两个类,实现CommandLineRunner接口,实现run方法,在run方法中添加处理逻辑。

@Order(5)
@Component
public class AppStartReport implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("AppStartReport : 项目成功启动------------------");
    }
}
@Order(2)
@Component
public class AppStartReport2 implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("AppStartReport2 : 项目成功启动------------------");
    }
}

启动效果:AppStartReport2 较AppStartReport 先执行:
【SpringBoot】中的ApplicationRunner接口 和 CommandLineRunner接口,SpringBoot,spring boot,后端,java

3. ApplicationRunner接口与CommandLineRunner接口的区别

区别:

  1. CommandLineRunner的方法参数是原始的参数,未做任何处理;
  2. ApplicationRunner的参数为ApplicationArguments对象,是对原始参数的进一步封装。ApplicationArguments是对参数(主要针对main方法)做了进一步的处理,可以解析–name=value的参数,我们就可根据name获取value。
@Component
public class AppStartReport3 implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("AppStartReport3 : 项目成功启动,参数为: " + Arrays.asList(args.getSourceArgs()));
    }
}
@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(App.class);
        ConfigurableApplicationContext context = application.run("aaa", "bbb");
        context.close();
    }
}

自行指定参数后,执行效果如下:
【SpringBoot】中的ApplicationRunner接口 和 CommandLineRunner接口,SpringBoot,spring boot,后端,java

也可以在Program arguments选项框设置初始值,“–key=value“形式,如“–argname=ccc”,如下图所示:
【SpringBoot】中的ApplicationRunner接口 和 CommandLineRunner接口,SpringBoot,spring boot,后端,java

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(App.class);
        ConfigurableApplicationContext context = application.run(args);
        context.close();
    }
}

启动器传入参数为main方法的参数args,效果如下:
【SpringBoot】中的ApplicationRunner接口 和 CommandLineRunner接口,SpringBoot,spring boot,后端,java

ApplicationArguments 源码分析

public interface ApplicationArguments {

   String[] getSourceArgs();

   Set<String> getOptionNames();

   boolean containsOption(String name);

   List<String> getOptionValues(String name);

   List<String> getNonOptionArgs();

}

资源参数分为两种,一种是在调用run方法时传入的(”aaa”,”bbb”),一种是配置的系统参数即main方法的args参数(”ccc”)。

  • 首先getSourceArgs方法,可以获取到所有参数,可以是自己传入的参数,也可以是配置的系统参数;

  • getNonOptionArgs方法即可获得我们传入的参数(”aaa”,”bbb”)。;

  • 其余3个方法,可获得系统参数。实际用法如下:
    EX:

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(App.class);
        ConfigurableApplicationContext context = application.run(args);
        ApplicationArguments arguments = context.getBean(ApplicationArguments.class);
        System.out.println("参数个数:" + arguments.getSourceArgs().length);
        System.out.println("Non OptionArgs:" + arguments.getNonOptionArgs());
        System.out.println("Option Names:" + arguments.getOptionNames());
        System.out.println("获取key为argname的value值:" + arguments.getOptionValues("argname"));
        System.out.println("是否包含key为argname的参数:" + arguments.containsOption("argname"));
        context.close();
    }
}

输出效果:
【SpringBoot】中的ApplicationRunner接口 和 CommandLineRunner接口,SpringBoot,spring boot,后端,java

参考链接:https://blog.csdn.net/qq_35006663/article/details/102264172文章来源地址https://www.toymoban.com/news/detail-658569.html

到了这里,关于【SpringBoot】中的ApplicationRunner接口 和 CommandLineRunner接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Security的API Key实现SpringBoot 接口安全

    Spring Security 提供了各种机制来保护我们的 REST API。其中之一是 API 密钥。API 密钥是客户端在调用 API 调用时提供的令牌。 在本教程中,我们将讨论如何在Spring Security中实现基于API密钥的身份验证。 API Keys 一些REST API使用API密钥进行身份验证。API密钥是一个标记,用于向API客户

    2024年03月15日
    浏览(47)
  • 【springboot】spring的Aop结合Redis实现对短信接口的限流

    场景: 为了限制短信验证码接口的访问次数,防止被刷,结合Aop和redis根据用户ip对用户限流 首先我们创建一个 Spring Boot 工程,引入 Web 和 Redis 依赖,同时考虑到接口限流一般是通过注解来标记,而注解是通过 AOP 来解析的,所以我们还需要加上 AOP 的依赖,最终的依赖如下:

    2024年02月05日
    浏览(39)
  • HttpServiceProxyFactory 在 Spring Boot 3 中的应用:Spring Boot 3 使用 HttpServiceProxyFactory 调用远程接口

    博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接 : 🔗 精选专栏 : 《面试题大全》 — 面试准备的宝典! 《IDEA开发秘籍》 — 提升你的IDEA技能! 《100天精通Golang》 — Go语言学习之旅! 领域矩阵 : 🌐 猫头虎技术领域矩阵 : 深入探索

    2024年02月02日
    浏览(47)
  • 【Spring Boot】SpringBoot 2.6.6 集成 SpringDoc 1.6.9 生成swagger接口文档

    之前常用的SpringFox在2020年停止更新了,新项目集成SpringFox出来一堆问题,所以打算使用更活跃的SpringDoc,这里简单介绍一下我这边SpringBoot2.6.6集成SpringDoc1.6.9的demo。 官网链接 maven为例: 代码如下(示例): 默认路径: UI界面 http://localhost:9527/swagger-ui/index.html json界面 http:/

    2024年02月09日
    浏览(29)
  • springboot~shardingsphere在非spring框架中的使用

    shardingsphere已经很方便的被springboot集成了,你只要引入 sharding-jdbc-spring-boot-starter 这个包就可以了,而如果是原生java的话,你就需要自己去实现了,主要是重新定义数据源,定义规则等问题,本文主要介绍原生环境下的shardingsphere的使用。 添加了数据源,确定了mysql数据库,

    2024年01月16日
    浏览(27)
  • Springboot实战之spring-boot-starter-data-elasticsearch搭建ES搜索接口

    本教程是本人亲自实战的,然后运行起来的全部步骤。 环境 Elasticsearch 7.15.2 Kibana 7.15.2 springboot 2.6.4 以及对应的spring-boot-starter-web和spring-boot-starter-data-elasticsearch fastjson 1.2.97 安装好Elasticsearch7.15.2以及对应的Kibana。 去Springboot Start 新建项目 使用 devtools 创建 number_of_shards 数据分

    2023年04月08日
    浏览(39)
  • 【已解决】在 SpringBoot 中使用 CloseableHttpClient 调用接口时,接收参数中的中文变为“?“

    由于项目需要,需要在代码中使用POST请求去调用另一个服务的接口,即不通过前端,A 项目直接在方法中发起HTTP请求调用 B 项目的接口,当请求体中的参数有中文时,参数接收后中文会变为“?”。 具体原因是参数的编码格式不对,默认为类型为 Content-Type: text/plain; charset=I

    2024年02月10日
    浏览(32)
  • 使用Feign进行微服务之间的接口调用:Spring Cloud Alibaba中的声明式服务调用

            Feign是一个声明式的 HTTP客户端框架 ,用于简化微服务架构中服务之间的通信。它是Spring Cloud框架的一部分,旨在提供一种优雅且易于使用的方式来定义和调用HTTP请求。         Feign的设计目标是让服务之间的通信变得更加简单和直观。通常情况下,在微服务

    2024年02月15日
    浏览(28)
  • Spring框架中的Resource接口是什么,以及它在加载和访问资源时的关键作用

    🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:Java框架 ✨文章内容: Resource 接口 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 理解 Spring 框架的核心技术对于构建 Java 应用程序至关重

    2024年02月09日
    浏览(38)
  • spring-websocket在SpringBoot(包含SpringSecurity)项目中的导入

    ✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 🥭本文内容:spring-websocket在SpringBoot(包含SpringSecurity)项目中的导入 -----------------------------------------------------       目录       --------------

    2024年02月15日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包