| |
|
开发:
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+篇文章) 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的代码:
ApplicationRunner的代码:
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 ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |