【RuoYi-Vue-Plus】刚启动的时候为什么加载了一些配置,主要看为什么sys_oss_config和sys_config 和sys_dict_data表的数据被加载了

【RuoYi-Vue-Plus】项目刚启动为什么Redis和控制台会查询一些数据

RuoYi-Vue-Plus源码分析

现象如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kuzLjIzU-1667371601579)(Ruo-Yi-Plus.assets/image-20221102135020850.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QShNwXpf-1667371601579)(Ruo-Yi-Plus.assets/image-20221102135058493.png)]

疑问:为什么项目刚启动什么都没干,就会查询这些东西?我之前有一篇文章,有讲过Ruo-Yi-Vue怎么查找,但是看这个好像和之前那个又不太一样。下面分析Ruo-Yi-Plus怎么查找:

① 这个我们应该从控制台,查看日志出发寻找突破点。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PqqQI02U-1667371601580)(Ruo-Yi-Plus.assets/image-20221102135637082.png)]

② 全局搜索类: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();
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BjsNobd6-1667371601580)(Ruo-Yi-Plus.assets/image-20221102140513334.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qbfz9rw7-1667371601581)(Ruo-Yi-Plus.assets/image-20221102140657112.png)]

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;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KkbYueBJ-1667371601581)(Ruo-Yi-Plus.assets/image-20221102140855209.png)]

把for循环里面所有遍历的都加到 Redis的 key:sys_oss_config里面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hHH6vt90-1667371601581)(Ruo-Yi-Plus.assets/image-20221102142227504.png)]

经过⑤ 我们现在已经知道了Redis 里面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ru0a34oQ-1667371601582)(Ruo-Yi-Plus.assets/image-20221102142411464.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iTfdwGIa-1667371601582)(Ruo-Yi-Plus.assets/image-20221102142439276.png)]

⑥ 继续分析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()));
}

存入数据库:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CSGei6hQ-1667371601582)(Ruo-Yi-Plus.assets/image-20221102142638504.png)]

存入Redis:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-48Zic9sz-1667371601583)(Ruo-Yi-Plus.assets/image-20221102142937629.png)]

⑦ 继续分析run()方法里面的dictTypeService.loadingDictCache();

存入数据库:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bPnNhOjM-1667371601583)(Ruo-Yi-Plus.assets/image-20221102143113703.png)]

存入 Redis:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2h5HffTr-1667371601583)(Ruo-Yi-Plus.assets/image-20221102143202686.png)]

总结

经过以上的分析我们知道了启动项目会因为类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缓存,重新启动项目,发现也是可以的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FFX4qy9A-1667371601583)(Ruo-Yi-Plus.assets/image-20221102143851493.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B9alOqjT-1667371601584)(Ruo-Yi-Plus.assets/image-20221102143859326.png)]

所以我们也可以把实现ApplicationRunner接口换成实现CommandLineRunner接口,然后实现相应的方法即可!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值