IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot/Spring扩展点系列之CommandLineRunner和ApplicationRunner实现缓存预热 -> 正文阅读

[Java知识库]SpringBoot/Spring扩展点系列之CommandLineRunner和ApplicationRunner实现缓存预热

历史文章(累计400+篇文章)

国内最全的Spring Boot系列之一

国内最全的Spring Boot系列之二

国内最全的Spring Boot系列之三

国内最全的Spring Boot系列之四

国内最全的Spring Boot系列之五》

SpringBoot配置文件内容加密,实现敏感信息保护 - 第431篇

扩展点系列之SmartInstantiationAwareBeanPostProcessor确定执行哪一个构造方法 - 432篇

扩展点系列之ApplicationContextAwareProcessor普通类获取Spring Bean - 第433篇

扩展点系列之初始化之@PostConstruct、init-method、InitializingBean - 第434篇

SpringBoot/Spring扩展点系列之FactoryBean让你不在懵逼 - 第435篇

SpringBoot/Spring扩展点系列之SmartInitializingSingleton - 第436篇

悟纤:师傅,徒儿最近状态不是很好。

师傅:徒儿,这是怎么了?

悟纤:就是注意力不集中,效率很低。

师傅:为师,最近刚好研究了获得专注的方法。

悟纤:那师傅,你赶紧分享一下呗。

师傅:对于专注的话,有这么几点:

(1)限制条件:设置一个截止时间,增加紧迫感。

(2)从中找到愉悦,人对于愉悦的事情,容易落地执行。

(3)安静的环境:当你需要专注工作的时候,请远离吵闹的环境,进入一个相对独立或者周围都是陌生人的环境。

(4)调控信道:当你想要专注一件事情的时候,调用多个信道来一起完成它。比如看书的时候,别只是用眼睛看,你可以用手指随着视线一起滑动。常用的信道有:视觉信道、听觉信道、触觉信道…

(5)去除杂念:主动进入受约束的环境、平时少看不相关的内容、想法冒出来先记录。

(6)注意休息:短休息(学习了一会,要适当休息下);中度休息(午休);夜晚睡眠质量 —— 好的身体是一切的根本。

导读

在应用程序启动后,需要执行特定的代码,比如加载缓存数据、打印自定义启动信息等。Spring Boot?为我们提供了ApplicationRunner、CommandLineRunner两个接口来实现上面的需求。

谁的文章?

在写CommandLineRunner和ApplicationRunner扩展点时,发展在几年前就有写过这个技术点的文章了《102. Spring Boot之CommandLineRunner和ApplicationRunner【从零开始学Spring Boot】》。

然后我就在百度上搜索了一下,发现了一篇和我的文章几乎一样的原创文章:

文章地址:https://blog.csdn.net/qq_43741569/article/details/86716109

我的文章:

文章地址:https://www.iteye.com/blog/412887952-qq-com-2353151?

通过发表时间来看,我的文章是发表在2017年1月15日,对方是2019年1月31日。

你说转载就转载么,为啥要说自己是原创的。再不然在文章末尾加一个参考文章这个总不过分吧。

一、CommandLineRunner和ApplicationRunner

1.1?是什么?

在开发过程中会有这样的场景:需要在容器启动的时候执行一些内容,比如:读取配置文件信息,数据库连接,删除临时文件,清除缓存信息,在Spring框架下是通过ApplicationListener监听器来实现的。在Spring Boot中给我们提供了两个接口CommandLineRunner和ApplicationRunner,来帮助我们实现这样的需求。

1.2?区别

1.2.1?相同点

(1)都可以获取到启动时指定的外部参数。

(2)主逻辑方法名称都是?run?。

(3)在?run?方法内部抛出异常时,?应用都将无法正常启动。

1.2.2?不同点

run?方法的参数不一致,?一个是?String[]数组,?一个是?ApplicationArguments?。

1.3?执行顺序

在没有指定加载顺序?@Order?时或?@Order?值一致时,?先执行?ApplicationRunner。

如果指定了加载顺序?@Order,则按照?@Order?的顺序进行执行。

说明:数字越小,优先级越高,也就是@Order(1)注解的类会在@Order(2)注解的类之前执行。

1.4?使用场景

应用服务启动时,加载一些数据和执行一些应用的初始化动作。举例说明:

(1)删除临时文件。

(2)缓存预热:项目启动时热加载数据库数据至缓存。

(3)清除缓存信息。

(4)读取配置文件信息。

(5)打印日志用于标识服务启动成功或者标识某些属性加载成功。

(6)设置属性值或者启动组件,例如开启某些组件的开关、一些应用级别缓存的加载、启动定时任务等等。

(7)需要使用main方法的入参。

1.5?回调时机

通过pringApplication#run()方法的源码,可以知道CommandLineRunner和ApplicationRunner的回调时机:

进入到callRunners()方法看下:

从这里也可以看出在没有指定Order的情况下,先执行ApplicationRunner,然后在执行CommandLineRunner。

在所有的CommandLineRunner和ApplicationRunner回调之前,下面的步骤已经确保执行完毕:

(1)Environment内置变量的创建和属性填充已经完成。

(2)Banner已经打印完毕。

(3)ApplicationContext和BeanFactory创建完成,并且完成了上下文刷新(refreshContext),意味着所有单例的Bean完成了初始化以及属性装配。

(4)Servlet容器启动成功,如内置的Tomcat、Jetty容器已经正常启动,可以正常接收请求和处理。

(5)启动信息完成打印,一般会看到日志输出类似Started ***Application in *** seconds (JVM running for ***)。

二、CommandLineRunner和ApplicationRunner的使用

对于CommandLineRunner和ApplicationRunner的使用,还是很简单的,我们还是使用个小栗子来说明一下。

2.1?构建项目

构建一个Spring Boot项目,这里在之前的一个项目spring-boot-applicationcontextinitializer-extend进行编码。

2.2?实现接口

实现接口CommandLineRunner或者ApplicationRunner:

CommandLineRunner的代码:

package com.kfit.config;?import org.springframework.boot.CommandLineRunner;import org.springframework.stereotype.Component;?/** * CommandLineRunner * * @author 悟纤「公众号SpringBoot」 * @date 2022-08-01 * @slogan 大道至简 悟在天成 */@Componentpublic class MyCommandLineRunner implements CommandLineRunner {    @Override    public void run(String... args) throws Exception {        if(args.length>=3){            System.out.println("MyCommandLineRunner.run,args:"+args[0]+","+args[1]+","+args[2]);        }else{            System.out.println("MyCommandLineRunner.run");        }    }}?

ApplicationRunner的代码:

package com.kfit.config;?import org.springframework.boot.ApplicationArguments;import org.springframework.boot.ApplicationRunner;import org.springframework.stereotype.Component;?/** * ApplicationRunner * *  program arguments: wuqian 18 --name=wukong * @author 悟纤「公众号SpringBoot」 * @date 2022-08-01 * @slogan 大道至简 悟在天成 */@Componentpublic class MyApplicationRunner implements ApplicationRunner {    @Override    public void run(ApplicationArguments args) throws Exception {        System.out.println("MyApplicationRunner.run,"+args.getOptionValues("name"));    }}?

2.3?测试

配置一下参数(也可以不配置):

启动运用看下控制台的信息打印:

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

最后如果要实现缓存预热的效果也很简单,这里说一下大体的思路:

(1)通过相应的服务从获取到数据;

(2)将获取到的数据放到缓存中;

?

à悟空学院:https://t.cn/Rg3fKJD

学院中有Spring?Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

ShardingJDBC分库分表:http://t.cn/A6ZarrqS

分布式事务解决方案:http://t.cn/A6ZaBnIr

JVM内存模型调优实战:http://t.cn/A6wWMVqG

Spring入门到精通:https://t.cn/A6bFcDh4

大话设计模式之爱你:https://dwz.cn/wqO0MAy7

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:29:56  更:2022-08-06 10:30:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:28:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码