我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot程序预装载数据怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot程序预装载数据怎么实现

这篇文章主要介绍“SpringBoot程序预装载数据怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot程序预装载数据怎么实现”文章能帮助大家解决问题。

    简介

    在项目实际的开发过程中,有时候会遇到需要在应用程序启动完毕对外提供服务之前预先将部分数据装载到缓存的需求。

    适用场景

    • 预装载应用级别数据到缓存:如字典数据、公共的业务数据

    • 系统预热

    • 心跳检测:如在系统启动完毕访问一个外服务接口等场景

    常用方法

    • ApplicationEvent

    • CommandLineRunner

    • ApplicationRunner

    ApplicationEvent

    应用程序事件,就是发布订阅模式。在系统启动完毕,向应用程序注册一个事件,监听者一旦监听到了事件的发布,就可以做一些业务逻辑的处理了。

    既然是发布-订阅模式,那么订阅者既可以是一个,也可以是多个。

    定义event

    import org.springframework.context.ApplicationEvent;public class CacheEvent   extends ApplicationEvent {    public CacheEvent(Object source) {        super(source);    }}

    定义listener

    import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationListener;import org.springframework.stereotype.Component;import org.springframework.util.CollectionUtils;import java.util.List;import java.util.Map;import java.util.stream.Collectors;@Slf4j@Componentpublic class CacheEventListener implements ApplicationListener<CacheEvent> {    @Autowired    private MaskingService maskingService;    @Autowired    private RedisCache redisCache;    @Override    public void onApplicationEvent(CacheEvent cacheEvent) {        log.debug("CacheEventListener-start");        List<SysMasking> maskings = maskingService.selectAllSysMaskings();        if (!CollectionUtils.isEmpty(maskings)) {            log.debug("CacheEventListener-data-not-empty");            Map<String, List<SysMasking>> cacheMap = maskings.stream().collect(Collectors.groupingBy(SysMasking::getFieldKey));            cacheMap.keySet().forEach(x -> {                if (StringUtils.isNotEmpty(x)) {                    log.debug("CacheEventListener-x={}", x);                    List<SysMasking> list = cacheMap.get(x);                    long count = redisCache.setCacheList(RedisKeyPrefix.MASKING.getPrefix() + x, list);                    log.debug("CacheEventListener-count={}", count);                } else {                    log.debug("CacheEventListener-x-is-empty");                }            });        } else {            log.debug("CacheEventListener-data-is-empty");        }        log.debug("CacheEventListener-end");    }}

    注册event

    @Slf4j@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})public class BAMSApplication {    public static void main(String[] args) {        ConfigurableApplicationContext context = SpringApplication.run(BAMSApplication.class, args);        log.debug("app-started");        context.publishEvent(new CacheEvent("处理缓存事件"));    }}

    CommandLineRunner

    通过实现 CommandLineRunner 接口,可以在应用程序启动完毕,回调到指定的方法中。

    package com.ramble.warmupservice.runner;import lombok.extern.slf4j.Slf4j;import org.springframework.boot.CommandLineRunner;import org.springframework.stereotype.Component;@Slf4j@Componentpublic class CacheCommandLineRunner implements CommandLineRunner {    @Override    public void run(String... args) throws Exception {        log.debug("CacheCommandLineRunner-start");        log.debug("CacheCommandLineRunner-参数={}", args);        // 注入业务 service ,获取需要缓存的数据        // 注入 redisTemplate ,将需要缓存的数据存放到 redis 中        log.debug("CacheCommandLineRunner-end");    }}

    ApplicationRunner

    同CommandLineRunner 类似,区别在于,对参数做了封装。

    package com.ramble.warmupservice.runner;import com.alibaba.fastjson.JSON;import lombok.extern.slf4j.Slf4j;import org.springframework.boot.ApplicationArguments;import org.springframework.boot.ApplicationRunner;import org.springframework.stereotype.Component;@Slf4j@Componentpublic class CacheApplicationRunner implements ApplicationRunner {    @Override    public void run(ApplicationArguments args) throws Exception {        log.debug("CacheApplicationRunner-start");        log.debug("CacheApplicationRunner-参数={}", JSON.toJSONString(args));        // 注入业务 service ,获取需要缓存的数据        // 注入 redisTemplate ,将需要缓存的数据存放到 redis 中        log.debug("CacheApplicationRunner-end");    }}

    测试

    上述代码在idea中启动,若不带参数,输出如下:

    2022-04-28 15:44:00.981  INFO 1160 --- [           main] c.r.w.WarmupServiceApplication           : Started WarmupServiceApplication in 1.335 seconds (JVM running for 2.231)
    2022-04-28 15:44:00.982 DEBUG 1160 --- [           main] c.r.w.runner.CacheApplicationRunner      : CacheApplicationRunner-start
    2022-04-28 15:44:01.025 DEBUG 1160 --- [           main] c.r.w.runner.CacheApplicationRunner      : CacheApplicationRunner-参数={"nonOptionArgs":[],"optionNames":[],"sourceArgs":[]}
    2022-04-28 15:44:01.025 DEBUG 1160 --- [           main] c.r.w.runner.CacheApplicationRunner      : CacheApplicationRunner-end
    2022-04-28 15:44:01.025 DEBUG 1160 --- [           main] c.r.w.runner.CacheCommandLineRunner      : CacheCommandLineRunner-start
    2022-04-28 15:44:01.026 DEBUG 1160 --- [           main] c.r.w.runner.CacheCommandLineRunner      : CacheCommandLineRunner-参数={}
    2022-04-28 15:44:01.026 DEBUG 1160 --- [           main] c.r.w.runner.CacheCommandLineRunner      : CacheCommandLineRunner-end
    2022-04-28 15:44:01.026 DEBUG 1160 --- [           main] c.r.w.listener.CacheEventListener        : CacheEventListener-start
    2022-04-28 15:44:01.026 DEBUG 1160 --- [           main] c.r.w.listener.CacheEventListener        : CacheEventListener-参数=ApplicationEvent-->缓存系统数据
    2022-04-28 15:44:01.029 DEBUG 1160 --- [           main] c.r.w.listener.CacheEventListener        : CacheEventListener-end
    Disconnected from the target VM, address: '127.0.0.1:61320', transport: 'socket'
    Process finished with exit code 130

    若使用 java -jar xxx.jar --server.port=9009 启动,则输入如下:

    2022-04-28 16:02:05.327  INFO 9916 --- [           main] c.r.w.WarmupServiceApplication           : Started WarmupServiceApplication in 1.78 seconds (JVM running for 2.116)
    2022-04-28 16:02:05.329 DEBUG 9916 --- [           main] c.r.w.runner.CacheApplicationRunner      : CacheApplicationRunner-start
    2022-04-28 16:02:05.393 DEBUG 9916 --- [           main] c.r.w.runner.CacheApplicationRunner      : CacheApplicationRunner-参数={"nonOptionArgs":[],"optionNames":["server.port"],"sourceArgs":["--server.port=9009"]}
    2022-04-28 16:02:05.395 DEBUG 9916 --- [           main] c.r.w.runner.CacheApplicationRunner      : CacheApplicationRunner-end
    2022-04-28 16:02:05.395 DEBUG 9916 --- [           main] c.r.w.runner.CacheCommandLineRunner      : CacheCommandLineRunner-start
    2022-04-28 16:02:05.395 DEBUG 9916 --- [           main] c.r.w.runner.CacheCommandLineRunner      : CacheCommandLineRunner-参数=--server.port=9009
    2022-04-28 16:02:05.395 DEBUG 9916 --- [           main] c.r.w.runner.CacheCommandLineRunner      : CacheCommandLineRunner-end
    2022-04-28 16:02:05.395 DEBUG 9916 --- [           main] c.r.w.listener.CacheEventListener        : CacheEventListener-start
    2022-04-28 16:02:05.396 DEBUG 9916 --- [           main] c.r.w.listener.CacheEventListener        : CacheEventListener- 参数=ApplicationEvent-->缓存系统数据
    2022-04-28 16:02:05.396 DEBUG 9916 --- [           main] c.r.w.listener.CacheEventListener        : CacheEventListener-end

    执行顺序

    从上面测试的输出,可以看到三种方式执行的顺序为:
    ApplicationRunner--->CommandLineRunner--->ApplicationEvent

    另外,若同时定义多个runner,可以通过order来指定他们的优先级。

    关于“SpringBoot程序预装载数据怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    SpringBoot程序预装载数据怎么实现

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    SpringBoot程序预装载数据怎么实现

    这篇文章主要介绍“SpringBoot程序预装载数据怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot程序预装载数据怎么实现”文章能帮助大家解决问题。简介在项目实际的开发过程
    2023-06-30

    SpringBoot怎么实现点餐小程序

    这篇文章主要介绍了SpringBoot怎么实现点餐小程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么实现点餐小程序文章都会有所收获,下面我们一起来看看吧。一,功能介绍本点单系统主要是基
    2023-07-02

    SpringBoot封装响应数据实现过程详解

    这篇文章主要介绍了SpringBoot封装响应数据实现过程,SpringBoot响应数据封装是指在SpringBoot应用程序中,将返回的数据进行封装,以便于前端页面或其他客户端使用,感兴趣想要详细了解可以参考下文
    2023-05-20

    SpringBoot+VUE怎么实现数据表格

    这篇文章主要讲解了“SpringBoot+VUE怎么实现数据表格”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot+VUE怎么实现数据表格”吧!目录前言使用的开发工具:一、前
    2023-06-20

    SpringBoot小程序推送信息怎么实现

    这篇文章主要介绍了SpringBoot小程序推送信息怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot小程序推送信息怎么实现文章都会有所收获,下面我们一起来看看吧。1.小程序推送信息列如
    2023-06-30

    怎么在python中实现数据预处理

    这篇文章将为大家详细讲解有关怎么在python中实现数据预处理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注
    2023-06-14

    SpringBoot多数据源切换怎么实现

    本篇内容主要讲解“SpringBoot多数据源切换怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot多数据源切换怎么实现”吧!配置文件(YML)spring: data
    2023-06-30

    springboot异步查询数据怎么实现

    在Spring Boot中,可以使用@Async注解来实现异步查询数据。以下是实现步骤:在主应用程序类中添加@EnableAsync注解,启用异步支持。@SpringBootApplication@EnableAsyncpublic c
    springboot异步查询数据怎么实现
    2024-03-07

    python数据预测模型算法怎么实现

    要实现一个Python数据预测模型算法,你需要遵循以下步骤:收集数据:首先,你需要收集相关数据,这些数据可以来自于各种来源,如数据库、文件、API等。数据清洗和准备:在运用数据进行预测之前,你需要对数据进行清洗和准备工作。这可能包括删除缺失
    python数据预测模型算法怎么实现
    2024-02-29

    微信小程序天气预报功能怎么实现

    这篇文章主要讲解了“微信小程序天气预报功能怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“微信小程序天气预报功能怎么实现”吧!这里我用的是和风天气的API,打开官网注册或者登陆你的账号
    2023-06-30

    oracle数据库倒序排序怎么实现

    在Oracle数据库中,可以使用ORDER BY子句配合DESC关键字来实现倒序排序。下面是一个示例:SELECT column1, column2FROM tableORDER BY column1 DESC;在以上示例中,colu
    oracle数据库倒序排序怎么实现
    2024-03-05

    Vue怎么实现分批加载数据

    本篇内容主要讲解“Vue怎么实现分批加载数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue怎么实现分批加载数据”吧!分批加载数据最近在写vue的项目,因为后台返回的数据量太大,在调用了高德
    2023-06-30

    Springboot动态切换数据源怎么实现

    这篇文章主要介绍“Springboot动态切换数据源怎么实现”,在日常操作中,相信很多人在Springboot动态切换数据源怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Springboot动态切换数
    2023-06-25

    SpringBoot怎么实现多数据源的切换

    这篇文章主要介绍“SpringBoot怎么实现多数据源的切换”,在日常操作中,相信很多人在SpringBoot怎么实现多数据源的切换问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoot怎么实现多
    2023-06-29

    winform异步加载数据怎么实现

    在WinForm中实现异步加载数据可以使用BackgroundWorker组件或者使用Task类来实现。方法一:使用BackgroundWorker组件1. 在窗体中添加一个BackgroundWorker组件,并设置其WorkerRepo
    2023-10-10

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录