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

这个时候我们就可以用到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. createrepo命令

    https://jingyan.baidu.com/article/4f34706e1f7b54e386b56d4b.html

  2. HeapByteBuffer与DirectByteBuffer

    HeapByteBuffer,顾名思义,是写在jvm堆上面的一个buffer,底层的本质是一个数组,用类封装维护了很多的索引(limit/position/capacity等) DirectByteB ...

  3. Struts2-052 漏洞复现

    s2-052漏洞复现 参考链接: http://www.freebuf.com/vuls/147017.html http://www.freebuf.com/vuls/146718.html 漏洞描 ...

  4. android gradle tools 3.X中dependencies, implementation和compile区别

    在3.0版本中,compile 指令被标注为过时方法,而新增了两个依赖指令,一个是implement 和api,这两个都可以进行依赖添加,但是有什么区别呢? api 指令 完全等同于compile指令 ...

  5. php编程 之 php基础二

    1,if...else...语句 规则简介: if 语句 - 在条件成立时执行代码 if...else 语句 - 在条件成立时执行一块代码,条件不成立时执行另一块代码 if...elseif....e ...

  6. 20165237 2017-2018-2 《Java程序设计》第6周学习总结

    20165237 2017-2018-2 <Java程序设计>第6周学习总结 教材学习内容总结 1.String类的常用方法: public int length() public boo ...

  7. android PopupWindow 显示问题

    设置可点击,其余控件也可点击,等操作 setOutsideTouchable(true);   setBackgroundDrawable(new BitmapDrawable()); setTouc ...

  8. 利用jTessBoxEditor工具进行Tesseract-OCR样本训练

    jTessBoxEditor依赖java虚拟机 , 所以要先安装 java. jTessBoxEditor下载地址: https://sourceforge.net/projects/vietocr/ ...

  9. C++ 11 snippets , 1

    1->创建7个Thread,跑个非常大的循环.观察CPU void func(string &name) { ;i<0xFFFFFFFF;i++) { //cout << ...

  10. tar.gz压缩,查看,解压

    本次使用的压缩格式是*.tar.gz,用到的命令如下: 压缩: tar -czf jpg.tar.gz *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个g ...