返回顶部
首页 > 资讯 > 精选 >SpringBoot程序预装载数据怎么实现
  • 134
分享到

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

2023-06-30 11:06:14 134人浏览 泡泡鱼
摘要

这篇文章主要介绍“SpringBoot程序预装载数据怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“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程序预装载数据怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

    --结束END--

    本文标题: SpringBoot程序预装载数据怎么实现

    本文链接: https://lsjlt.com/news/328382.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • SpringBoot程序预装载数据怎么实现
      这篇文章主要介绍“SpringBoot程序预装载数据怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot程序预装载数据怎么实现”文章能帮助大家解决问题。简介在项目实际的开发过程...
      99+
      2023-06-30
    • SpringBoot程序预装载数据的实现方法及实践
      目录简介适用场景ApplicationEvent定义event定义listener注册eventCommandLineRunnerApplicationRunner测试执行顺序代码简...
      99+
      2024-04-02
    • 小程序如何实现图片预加载
      这篇文章主要为大家展示了“小程序如何实现图片预加载”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“小程序如何实现图片预加载”这篇文章吧。    网页有页面预加载,小程序也有图片预加载,小程序图片加...
      99+
      2023-06-26
    • SpringBoot怎么实现点餐小程序
      这篇文章主要介绍了SpringBoot怎么实现点餐小程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么实现点餐小程序文章都会有所收获,下面我们一起来看看吧。一,功能介绍本点单系统主要是基...
      99+
      2023-07-02
    • SpringBoot封装响应数据实现过程详解
      目录业务处理封装响应值传值容器ModelModelMapHttpServletRequest重定向传值业务处理 这是通过 Spring 在 Controller中注入Service模...
      99+
      2023-05-20
      SpringBoot封装响应数据 SpringBoot响应数据的封装
    • WordPress怎么实现HTML5预加载
      小编给大家分享一下WordPress怎么实现HTML5预加载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  HTM...
      99+
      2024-04-02
    • android预加载效果怎么实现
      实现Android预加载效果可以使用以下几种方法:1. 使用AsyncTask:在Activity或Fragment中创建一个Asy...
      99+
      2023-08-17
      android
    • SpringBoot+VUE怎么实现数据表格
      这篇文章主要讲解了“SpringBoot+VUE怎么实现数据表格”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot+VUE怎么实现数据表格”吧!目录前言使用的开发工具:一、前...
      99+
      2023-06-20
    • SpringBoot小程序推送信息怎么实现
      这篇文章主要介绍了SpringBoot小程序推送信息怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot小程序推送信息怎么实现文章都会有所收获,下面我们一起来看看吧。1.小程序推送信息列如...
      99+
      2023-06-30
    • Chainer怎么实现数据增强和数据预处理
      Chainer提供了一系列内置的数据增强和数据预处理函数来帮助用户实现数据增强和数据预处理。以下是一些常用的方法: 数据增强: ...
      99+
      2024-04-02
    • CNTK怎么实现数据增强和数据预处理
      CNTK(Microsoft Cognitive Toolkit)是一个深度学习框架,可以使用一些技术来实现数据增强和数据预处理。以...
      99+
      2024-04-02
    • 微信小程序如何实现图片预加载组件
      这篇文章主要为大家展示了“微信小程序如何实现图片预加载组件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序如何实现图片预加载组件”这篇文章吧。网页中的图...
      99+
      2024-04-02
    • 怎么在python中实现数据预处理
      这篇文章将为大家详细讲解有关怎么在python中实现数据预处理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注...
      99+
      2023-06-14
    • Fastai怎么实现文本数据预处理
      Fastai是一个用于深度学习的开源库,它提供了一种简单而高效的方法来进行文本数据预处理。下面是一些Fastai中常用的文本数据预处...
      99+
      2024-04-02
    • PHP7.4中怎么实现预加载方法
      这篇文章将为大家详细讲解有关PHP7.4中怎么实现预加载方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言PHP 7.4增加了预加载支持,这一功能可以显...
      99+
      2024-04-02
    • SpringBoot实现加载yml文件中字典数据
      将字典数据,配置在 yml 文件中,通过加载yml将数据加载到 Map中 Spring Boot 中 yml 配置、引用其它 yml 中的配置。# 在配置文件目录(如:resourc...
      99+
      2023-05-16
      SpringBoot加载yml文件字典数据 SpringBoot yml字典数据 SpringBoot yml数据 SpringBoot yml
    • Springboot使用influxDB时序数据库的实现
      目录引入依赖 配置 构建实体类 保存数据 查询数据 项目中需要存放大量设备日志,且需要对其进行简单的数据分析,信息提取工作. 结合众多考量因素,项目决定使用时序数据库中的领头羊In...
      99+
      2024-04-02
    • sqlldr中怎么装载数据
      sqlldr中怎么装载数据,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1)把 excel 数据存为 t.txt 文件,注意文件后缀名为 ...
      99+
      2024-04-02
    • SpringBoot多数据源切换怎么实现
      本篇内容主要讲解“SpringBoot多数据源切换怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot多数据源切换怎么实现”吧!配置文件(YML)spring: ...
      99+
      2023-06-30
    • springboot异步查询数据怎么实现
      在Spring Boot中,可以使用@Async注解来实现异步查询数据。以下是实现步骤: 在主应用程序类中添加@EnableAsy...
      99+
      2024-03-07
      springboot
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作