【RuoYi-Vue-Plus】刚启动的时候为什么加载了一些配置,主要看为什么sys_oss_config和sys_config 和sys_dict_data表的数据被加载了
【RuoYi-Vue-Plus】刚启动的时候为什么加载了一些配置,主要看为什么sys_oss_config和sys_config 和sys_dict_data表的数据被加载了
【RuoYi-Vue-Plus】项目刚启动为什么Redis和控制台会查询一些数据
RuoYi-Vue-Plus源码分析
现象如下:
疑问:为什么项目刚启动什么都没干,就会查询这些东西?我之前有一篇文章,有讲过Ruo-Yi-Vue怎么查找,但是看这个好像和之前那个又不太一样。下面分析Ruo-Yi-Plus怎么查找:
① 这个我们应该从控制台,查看日志出发寻找突破点。
② 全局搜索类:SystemApplicationRunner
@Slf4j
@RequiredArgsConstructor // 使用构造函数注入
@Component // 此类一定要交给spring管理
public class SystemApplicationRunner implements ApplicationRunner {
private final RuoYiConfig ruoyiConfig;
private final ISysConfigService configService;
private final ISysDictTypeService dictTypeService;
private final ISysOssConfigService ossConfigService;
@Override
public void run(ApplicationArguments args) throws Exception {
ossConfigService.init();
log.info("初始化OSS配置成功");
if (ruoyiConfig.isCacheLazy()) {
return;
}
configService.loadingConfigCache();
log.info("加载参数缓存数据成功");
dictTypeService.loadingDictCache();
log.info("加载字典缓存数据成功");
}
}
我们发现这个类实现了 接口 ApplicationRunner
③ 学习类 ApplicationRunner
# 实现 ApplicationRunner接口:
- 在项目中,可能会遇到这样一个问题:在项目启动完成之后,紧接着执行一段代码。在SpringBoot中,提供了一个接口:ApplicationRunner。该接口中,只有一个run方法,他执行的时机是:spring容器启动完成之后,就会紧接着执行这个接口实现类的run方法。
# 注意点
- 这个实现类,要注入到spring容器中,这里使用了@Component注解;
- 在同一个项目中,可以定义多个ApplicationRunner的实现类,他们的执行顺序通过注解@Order注解或者再实现Ordered接口来实现。
- run方法的参数:ApplicationArguments可以获取到当前项目执行的命令参数。(比如把这个项目打成jar执行的时候,带的参数可以通过ApplicationArguments获取到);
- 由于该方法是在容器启动完成之后,才执行的,所以,这里可以从spring容器中拿到其他已经注入的bean。
④ 根据③前面的分析我们知道了,刚启动项目,就会执行类 SystemApplicationRunner
,因为该类实现了 ApplicationRunner
接口,并且执行执行需要重写的run()
方法
@Override
public void run(ApplicationArguments args) throws Exception {
ossConfigService.init();
log.info("初始化OSS配置成功");
if (ruoyiConfig.isCacheLazy()) {
return;
}
configService.loadingConfigCache();
log.info("加载参数缓存数据成功");
dictTypeService.loadingDictCache();
log.info("加载字典缓存数据成功");
}
⑤ ossConfigService.init();
@Override
public void init() {
// 查询表 sys_oss_config 表所有数据
List<SysOssConfig> list = baseMapper.selectList();
// 加载OSS初始化配置
for (SysOssConfig config : list) {
// 得到 每条数据的 config_key
String configKey = config.getConfigKey();
// 状态(0正常 1停用)
// 如果当前一条的状态是 正常的0
if ("0".equals(config.getStatus())) {
// 存入 Redis 中
// String DEFAULT_CONFIG_KEY = "sys_oss:default_config";
RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, configKey);
}
setConfigCache(true, config);
}
// 初始化OSS工厂
OssFactory.init();
}
private boolean setConfigCache(boolean flag, SysOssConfig config) {
if (flag) {
// SYS_OSS_CONFIG = "sys_oss_config";
CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config));
// String DEFAULT_CONFIG_KEY = "sys_oss:default_config";
RedisUtils.publish(OssConstant.DEFAULT_CONFIG_KEY, config.getConfigKey(), msg -> {
log.info("发布刷新OSS配置 => " + msg);
});
}
return flag;
}
把for循环里面所有遍历的都加到 Redis的 key:sys_oss_config里面
经过⑤ 我们现在已经知道了Redis 里面
⑥ 继续分析run()
方法里面的onfigService.loadingConfigCache();
@Override
public void loadingConfigCache() {
List<SysConfig> configsList = selectConfigList(new SysConfig());
configsList.forEach(config ->
// String SYS_CONFIG = "sys_config";
CacheUtils.put(CacheNames.SYS_CONFIG, config.getConfigKey(), config.getConfigValue()));
}
存入数据库:
存入Redis:
⑦ 继续分析run()
方法里面的dictTypeService.loadingDictCache();
存入数据库:
存入 Redis:
总结
经过以上的分析我们知道了启动项目会因为类SystemApplicationRunner
实现了ApplicationRunner
接口,所以在启动项目后就会执行 里面的run()
方法,这个方法操作了三个表 ①sys_oss_config ②sys_config ③sys_dict_data,而且都是先查询数据库,然后保存到 Redis 里面,所以我们在启动项目后控制台和 Redis 里面就会出现那些数据。
扩展
我们把ApplicationRunner
接口换成CommandLineRunner
接口,修改SystemApplicationRunner
类变成如下
@Slf4j
@RequiredArgsConstructor // 使用构造函数注入
@Component // 此类一定要交给spring管理
public class SystemApplicationRunner implements CommandLineRunner {
private final RuoYiConfig ruoyiConfig;
private final ISysConfigService configService;
private final ISysDictTypeService dictTypeService;
private final ISysOssConfigService ossConfigService;
@Override
public void run(String... args) throws Exception {
ossConfigService.init();
log.info("初始化OSS配置成功");
if (ruoyiConfig.isCacheLazy()) {
return;
}
configService.loadingConfigCache();
log.info("加载参数缓存数据成功");
dictTypeService.loadingDictCache();
log.info("加载字典缓存数据成功");
}
}
其他都不变,清空控制台和Redis缓存,重新启动项目,发现也是可以的
所以我们也可以把实现ApplicationRunner
接口换成实现CommandLineRunner
接口,然后实现相应的方法即可!!!
更多推荐
所有评论(0)