【SpringBoot实用小知识】如何将数据库中的内容在启动时放入缓存中?

前言

使用设计模式设计出一个可拓展 可用于业务项目的审核模块还在写 先给大家一个开胃小菜吧
相信很多情况下 我们需要缓存一些数据库中的内容 如部分权限信息 热点信息 或是 使用频率较高的信息 这东西很明显放在启动时将其加载是最好的 那么在SpringBoot中我们怎么在启动时进行这种操作呢
强如SpringBoot 肯定为我们提供了这些接口来进行拉

CommandLineRunner 和 ApplicationRunner

这两个接口就是SpringBoot提供给我们用于在启动SpringBoot之后进行一些额外操作的拓展接口

这两个接口都要求实现一个run方法,在该方法中可以编写需要在应用程序启动完成后立即执行的任务

这两个接口都支持在其中使用@Resource或@Autowired来进行依赖注入 因为它们执行时所有单例bean都已经完成了初始化

至于它们的顺序 是当所有bean的初始化工作完成之后,Spring会调用CommandLineRunner或ApplicationRunner的run方法 这些方法在一个同步的环境中按定义顺序执行 也就是说 一个bean的run方法必须完成执行 下一个bean的run方法才会开始
如果在run方法中抛出异常,两者都会导致Spring Boot应用的启动失败

两者的区别

两者的区别主要体现在执行顺序上 还有作用的略微区别

CommandLineRunner接收一个String[] args数组作为参数 这个数组包含了应用启动时传递给JVM的命令行参数
ApplicationRunner接收一个ApplicationArguments对象 它提供了更多关于命令行参数的信息 包括选项、非选项参数以及是否包含非选项参数等。

也正因为ApplicationRunner有关于命令行参数的详细信息 因此如果需要命令行参数相关信息的时候 它会更好用一些 不过对于大部分项目而言 还远远达不到调优的地步

至于它们的执行顺序区别 在Spring Boot应用启动过程中,如果同时实现了CommandLineRunner和ApplicationRunner 那么ApplicationRunner会在CommandLineRunner之后执行 这是因为ApplicationRunner依赖于CommandLineRunner的执行结果 以便从ApplicationArguments中获得完整的信息

使用

CommandLineRunner为例 我们加载一下数据库中的内容标签信息到Redis中
首先 要将其放在一个合适的包下 这里根据它们的功能不同 推荐放的包有些不同

业务逻辑相关

如果初始化任务紧密关联于特定的业务模块,那么最好将此类放在对应业务模块的包下 例如 如果初始化任务涉及到用户数据的预加载,那么可以将其放在serviceuser包下

基础配置或工具类

如果初始化任务是通用的,或者与多个业务模块相关,可以考虑将其放在configutil这类包下 这样 它们就与其他配置类或工具类一起组织,便于查找和管理。

启动配置相关

有些项目可能会有一个专门的启动配置类或包,例如bootapplication 可以在这里放置 尤其是作用是与应用启动紧密相关的初始化任务。

资源初始化

如果初始化任务主要是为了预加载或设置静态资源 比如数据库连接 缓存预热等 可以考虑将其放在resourcedata包下

package org.fuys.coder.config.hook;

import org.fuys.coder.common.constants.RedisConstants;
import org.fuys.coder.common.util.RedisUtil;
import org.fuys.coder.domain.category.service.ICategoryService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;

import javax.annotation.Resource;


/**
 * @description: 从数据库读取内容至缓存中
 * @date: 2024/7/5 22:38
 * @version: 1.0
 */
@Component
public class DBToCacheHook implements CommandLineRunner {

    @Resource
    private ICategoryService categoryService;

    @Resource
    private RedisUtil redisUtil;

    @Override
    public void run(String... args) throws Exception {
        String categoryRedisKey = RedisConstants.REDIS_FIELD_CATEGORY + RedisConstants.REDIS_DESC_ALL;
        redisUtil.deleteKey(categoryRedisKey);
        redisUtil.setList(categoryRedisKey, categoryService.getAllCategory());
    }
}

最后

可能部分读者感觉本文有点水 毕竟都说了是小知识 别着急 大的马上到
使用设计模式设计出一个可拓展 可用于业务项目的审核模块正在写 读者可以先准备阿里云相关的审核安全以及oss的账号 以满足准备需要
如果创建账号过程中出现问题 可以询问一些ai来解决 这里推荐阿里自己家的ai 通义
链接: 通义
之后也会出像这样的小文章来让大家做出一个可以集成到SpringBoot的ai问答模块 可以先点个关注~

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值