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

这个时候我们就可以用到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. java语言什么时候诞生的?

    java语言什么时候诞生的?创始人是谁?何时发布的? Java编程语言是sun Microsystems公司JamesGosling在1990年创建的1995年公布于世

  2. oracle 清理跟踪文件trc,trm

    oracle的日志文件有以下几种: 警告日志,trace日志,audit日志,redo日志,归档日志 a.警告日志:也就是alert log,使用初始化参数 show parameter backgr ...

  3. TCP通信实现对接硬件发送与接收十六进制数据 & int与byte的转换原理 & java中正负数的表示

    今天收到的一份需求任务是对接硬件,TCP通信,并给出通信端口与数据包格式,如下: 1.首先编写了一个简单的十六进制转byte[]数组与byte[]转换16进制字符串的两个方法,如下: /** * 将十 ...

  4. pyinstaller 打包exe可执行文件

    Python打包EXE方法之一 一.安装Pyinstaller 1.安装pywin32 下载安装文件:查找到跟自己适用的python版本及window系统版本匹配的pywin32,下载后安装 使用pi ...

  5. 【转】Win10下python3和python2多版本同时安装并解决pip共存问题

    [转]Win10下python3和python2多版本同时安装并解决pip共存问题 特别说明,本文是在Windows64位系统下进行的,32位系统请下载相应版本的安装包,安装方法类似. 使用pytho ...

  6. [debug]记一次竞态更新bug的解决

    公司的django项目,有一个旧接口,使用POST方法更新用户的一种记录型数据. 这个接口的历史有点长,最早的时候没有那么多需求,只会更新两个布尔字段.后来,加入一个需要高频次记录的字段.这些字段都属 ...

  7. 036_lua应用扩展

    一.request_id定义 ## # request id ## lua_package_path '/opt/nginx/conf/lua/lib/?.lua'; init_by_lua ' uu ...

  8. python decorators

    it's a syntatical sugar: @function1 def function2: do something equal to: function2 = function1(func ...

  9. tcp和udp协议的聊天 和udp协议的时间同步机制-----编码

    tcp协议聊天 服务端:: 客户端 udp协议的聊天 ############ udp协议 ########### 服务器 import socket sk = socket.socket(type ...

  10. 【原创】大叔经验分享(30)CM开启kerberos

    kerberos安装详见:https://www.cnblogs.com/barneywill/p/10394164.html 一 为CM创建用户 # kadmin.local -q "ad ...