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中
首先 要将其放在一个合适的包下 这里根据它们的功能不同 推荐放的包有些不同
如果初始化任务紧密关联于特定的业务模块,那么最好将此类放在对应业务模块的包下 例如 如果初始化任务涉及到用户数据的预加载,那么可以将其放在service或user包下
如果初始化任务是通用的,或者与多个业务模块相关,可以考虑将其放在config或util这类包下 这样 它们就与其他配置类或工具类一起组织,便于查找和管理。
有些项目可能会有一个专门的启动配置类或包,例如boot或application 可以在这里放置 尤其是作用是与应用启动紧密相关的初始化任务。
如果初始化任务主要是为了预加载或设置静态资源 比如数据库连接 缓存预热等 可以考虑将其放在resource或data包下
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问答模块 可以先点个关注~