在日常的项目开发中经常会遇到这样的需求:项目启动的时候进行一些一次性的初始化工作,如读取加载资源文件、或者执行其它外部程序。

这个时候我们就可以用到spring-boot为我们提供的一种扩展机制--Runner。

在spring-boot中提供了两种Runner接口:ApplicationRunner和CommandLineRunner,接下来我们就看看他们都是怎么使用的

Runner的使用

要想在我们的项目中使用ApplicaitonRunner和CommandLineRunner只需要实现如下代码即可:

从代码中我们可以看出使用上是非常方便的,只需要实现相应的接口类,然后创建bean即可。上面的代码的输出结果为:

ApplicaitonRunner和CommandLineRunner相比,它们虽然都只有一个run接口,但是各自接收的参数类型却不一样,这也是他们唯一的区别。

  • CommandLineRunner的run方法接收的是一个String类型的可变参数,它的值就是我们main函数接收到的命令行参数。
  • ApplicaitonRunner的run方法接收一个ApplicationArguments类型的参数,ApplicationArguments会对spring-boot程序的启动参数进行解析和分类,把[--{operation-name}={operation-value}]解析操作参数,其它情况被分类为非操作参数。
--op1=value1 --op2=value2 arg1 arg2
操作类参数:op1---值为value2,op2---值为value2
非操作参数:arg1,arg2

Runner的实现原理

spring-boot的runner扩展的实现也是非常的简单的。写过spring-boot程序的朋友一定对SpringApplication.run方法影响深刻,我们今天讲的runner也是在这个方法中被调用的。整个调用过程:

  1. SpringApplication.run调用callRunners方法
  2. 查找实现了ApplicationRunner和CommandLineRunner接口的Bean,统一存放在一个list中
  3. 根据Bean的order进行排序
  4. 循环调用每一个Runner Bean的run接口。

实现过程的核心代码:

Spring Boot如何使用Runner实现启动时调用?用法和原理都在这里的更多相关文章

  1. Spring boot采坑记--- 在启动时RequstMappingHandlerMapping无法找到部分contorller类文件的解决方案

    最近有一个心得需求,需要在一个现有的springboot项目中增加一些新的功能,于是就在controller文件包下面创建新的包和类文件,但是后端开发完之后,本地测试发现前端访问报404错误,第一反应 ...

  2. 使用Spring boot整合Hive,在启动Spring boot项目时,报错

    使用Spring boot整合Hive,在启动Spring boot项目时,报出异常: java.lang.NoSuchMethodError: org.eclipse.jetty.servlet.S ...

  3. Spring boot 整合hive-jdbc导致无法启动的问题

    使用Spring boot整合Hive,在启动Spring boot项目时,报出异常: 经过排查,是maven的包冲突引起的,具体做法,排除:jetty-all.hive-shims依赖包.对应的po ...

  4. 精尽Spring Boot源码分析 - SpringApplication 启动类的启动过程

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  5. Spring Boot 在接收上传文件时,文件过大异常处理问题

    Spring Boot 在接收上传文件时,文件过大时,或者请求过大,spring内部处理都会抛出异常,并且捕获不到. 虽然可以通过调节配置,增大 请求的限制值. 但是还是不太方便. 之所以捕获不到异常 ...

  6. spring boot不要放在tomcat下启动,因为自身就带了集成tomcat

    spring boot不要放在tomcat下启动,因为自身就带了集成tomcat

  7. 《spring boot》8.2章学习时无法正常启动,报“ORA-00942: 表或视图不存在 ”

    在学习<spring boot>一书的过程中,由于原书作者难免有一些遗漏的的地方,或者系统.软件版本不一致.框架更新等各种因素,完全安装书中源码页不能实现项目的正常启动 在8.2章节,演示 ...

  8. Spring Boot应用的启动和停止(Spring Boot应用通过start命令启动)

    Spring Boot,作为Spring框架对“约定优先于配置(Convention Over Configuration)”理念的最佳实践的产物,它能帮助我们很快捷的创建出独立运行.产品级别的基于S ...

  9. spring boot 不占用端口方式启动

    随着微服务架构的流行,想要启动一个微服务架构项目就要开启好多端口,有时候一台机器上部署的项目多的时候,端口资源就比较紧张了,其实有的微服务组件仅仅只是提供RPC服务,可以不用占用web启动的端口,此时 ...

随机推荐

  1. Callable的用法示例

    //Runnable是执行工作的独立任务,但是它不返回任何值.在JavaSE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表的是从方法call()中返回的值,并且必须使用Execut ...

  2. 【转载】双调排序Bitonic Sort,适合并行计算的排序算法

    双调排序是data-independent的排序, 即比较顺序与数据无关的排序方法, 特别适合做并行计算,例如用GPU.fpga来计算. 1.双调序列 在了解双调排序算法之前,我们先来看看什么是双调序 ...

  3. 为什么可逆矩阵又叫“非奇异矩阵(non-singular matrix)”?

    最近在捡回之前的线性代数知识,在复习可逆矩阵的时候,发现有的书上把可逆矩阵又称为非奇异矩阵,乍一看名字完全不知所云,仔细一分析,还是不明白.要想弄明白,还是得从英文入手,下面的解释主要从这里得来的Wh ...

  4. 【转】python包导入细节

    [转]python包导入细节 包导入格式 导入模块时除了使用模块名进行导入,还可以使用目录名进行导入.例如,在sys.path路径下,有一个dir1/dir2/mod.py模块,那么在任意位置处都可以 ...

  5. 算法:60.第k个排列

    解答参考:https://blog.csdn.net/lqcsp/article/details/23322951 题目链接:https://leetcode-cn.com/problems/perm ...

  6. eMMC基础技术11:flash memory

    [转]http://www.wowotech.net/basic_tech/367.html 0.前言 eMMC 是 Flash Memory 的一类,在详细介绍 eMMC 之前,先简单介绍一下 Fl ...

  7. Redis 通过 info 查看信息和状态

    INFO INFO [section] 以一种易于解释(parse)且易于阅读的格式,返回关于 Redis 服务器的各种信息和统计数值. 通过给定可选的参数 section ,可以让命令只返回某一部分 ...

  8. C++ URLencode library

    I need a library that can URLencode a string/char array. Now, I can hex encode an ASCII array like h ...

  9. struts2框架之文件上传(参考第三天学习笔记)

    上传 1. 上传对表单的要求 * method=post * enctype=multipart/form-data 2. 上传对servlet要求 * getParameter()不能再使用! -- ...

  10. Codeforces 675D Tree Construction Splay伸展树

    链接:https://codeforces.com/problemset/problem/675/D 题意: 给一个二叉搜索树,一开始为空,不断插入数字,每次插入之后,询问他的父亲节点的权值 题解: ...