SpringBoot 加载系统资源至缓存
创始人
2025-06-01 02:28:48

开发环境: IDEA 2022.1.4+ MyBatis

        代码参考:springboot启动后加载字典表数据供业务调用

        参考

        Spring-boot中的CommandLineRunner的作用 - 简书

        https://www.cnblogs.com/yanxiaoguo/p/16167221.html

目录

1. 概述

2. 实现步骤

        2.1 新建一个缓存类 DictResourceCache

        2.2 新建Runner类实现CommandLineRunner接口

        2.3 定义工具类 SpringUtils

        2.4 controller接口

        2.5 PostMan测试

3. 结语


1. 概述

        平常做PC端程序时候,在程序启动时候,都会去事先加载数据字典信息,想着SpringBoot也可以实现这块功能,特百度查询资料,可以使用CommandLineRunner来实现。

        通过实现CommandLineRunner接口的run方法, 结合@Component、@Order的使用,可以来实现数据加载顺序。对于@Order的value属性(int类型),值越低优先级越高。
       

2. 实现步骤

        效果: 我在服务启动时候,将用户信息加载到缓存中,当使用PostMan来调用获取用户信息时候,从缓存中直接获取.

        此处SpringBoot+MyBatis的配置就暂不描述了。

        2.1 新建一个缓存类 DictResourceCache

        这个类主要有个静态的集合对象cache,

        Map>, key值代表字典名称,List为对应的集合。也就是说,这个Map对象可以缓存多个数据字典的信息。 然后可以根据getDict()方法, 获取特定数据字典信息。

@Slf4j
public class DictResourceCache {private static UserMapper userMapper;private static Map> cache= new HashMap<>();/*** 加载字典*/public static void load(){cache.clear();SqlSession sqlSession= null;try{sqlSession= MybatisUtils.getSqlSession();//userMapper= sqlSession.getMapper(UserMapper.class);userMapper= SpringUtils.getBean(UserMapper.class);List listUser= userMapper.getUserList();cache.put("User", listUser);} catch (Exception e){e.printStackTrace();}}/*** 根据字典名 获取元素列表* @param dicName* @return*/public static List getDict(String dicName){List list= cache.get(dicName);if (CollectionUtils.isEmpty(list)){return new ArrayList<>();}return cache.get(dicName);}
}

        2.2 新建Runner类实现CommandLineRunner接口

        这个接口使用了@Component、@Order注解。 重写run()方法,调用缓存类的DictResourceCache的load()方法。

@Slf4j
@Component
@Order(2)
public class DictResourceRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {log.info("加载数据字典...");DictResourceCache.load();log.info("加载完毕...");}
}

        2.3 定义工具类 SpringUtils

        这个我看的半明白, 与BeanFactory有关。通过@Component注解,将该类交由Spring管理.

@Component
public class SpringUtils implements BeanFactoryPostProcessor {/*** Spring应用上下文环境*/private static ConfigurableListableBeanFactory beanFactory;@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {SpringUtils.beanFactory= configurableListableBeanFactory;}public static  T getBean(String name) throws BeansException{name= lowerCaseInit(name);if(containsBean(name)){return (T) beanFactory.getBean(name);} else{return null;}}/*** 获取* @param cls* @return* @param * @throws BeansException*/public static  T getBean(Class cls) throws BeansException{T result= (T) beanFactory.getBean(cls);return result;}/*** 判断 BeanFactory是否包含bean对象* @param name* @return*/public static boolean containsBean(String name){return beanFactory.containsBean(name);}/*** 判断以给定名字注册的bean定义是一个singleton还是一个prototype。* 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)* @param name* @return* @throws NoSuchBeanDefinitionException*/public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException{return beanFactory.isSingleton(name);}public static Class getType(String name) throws NoSuchBeanDefinitionException{return beanFactory.getType(name);}public static String[] getAliases(String name) throws NoSuchBeanDefinitionException{return beanFactory.getAliases(name);}/*** 首字母小写* @param name* @return*/private static String lowerCaseInit(String name){if(name.length()>0){char c= name.charAt(0);if(c>=65 && c<=90){int i= c+ 32;return ((char)i)+ name.substring(1);} else{return name;}} else{return null;}}
}

        2.4 controller接口

        在接口处理中,直接从缓存集合中获取User的所有字典信息。

    @GetMapping("/user/getUserList")public Result getUserList(){return Result.ok(DictResourceCache.getDict("User"));
//        System.out.println("info:>>>>>>>>>>>>>>>"+ info);
//        List userList= service.query();
//        return Result.ok(userList);}

        2.5 PostMan测试

3. 结语

        我简单理解为, @Component+@Order组合,Spring启动会自动去加载对应的类(实现CommandLineRunner接口),并执行run()方法。

        SpringUtils看的半明白,我得多理解下。

相关内容

热门资讯

pms系统是什么意思 极速百科... pms系统是什么意思目录pms系统是什么意思pms系统是什么意思mis系统是什么pms什么意思pms...
无影灯原理(无影灯原理图讲解)... 今天给各位分享无影灯原理的知识,其中也会对无影灯原理图讲解进行解释,如果能碰巧解决你现在面临的问题,...
蜂蜜的用途(蜂蜜的用途是什么)... 本篇文章极速百科给大家谈谈蜂蜜的用途,以及蜂蜜的用途是什么对应的知识点,希望对各位有所帮助,不要忘了...
16K纸有多大比A4的大还是小... 今天给各位分享16K纸有多大比A4的大还是小的知识,其中也会对16k的纸是a4纸的一半吗进行解释,如...
许昌新车上牌地址(许昌新车上牌... 今天给各位分享许昌新车上牌地址的知识,其中也会对许昌新车上牌地址查询进行解释,如果能碰巧解决你现在面...
八大艺术有哪些,艺术的八大类分... 八大艺术有哪些目录八大艺术有哪些艺术的八大类分别是什么世界公认的七大艺术是什么?什么被称八大艺术八大...
离我最近的北京现代4s店(离我... 本篇文章极速百科给大家谈谈离我最近的北京现代4s店,以及离我最近的北京现代4s店保养车对应的知识点,...
导轨油和机油的区别?(导轨油和... 今天给各位分享导轨油和机油的区别?的知识,其中也会对导轨油和机油的区别是什么进行解释,如果能碰巧解决...
免检卡板有什么好的,与熏蒸卡板... 本篇文章极速百科给大家谈谈免检卡板有什么好的,与熏蒸卡板有什么区别呢?,以及免检卡板图片对应的知识点...
东风雪铁龙c3xr怎么样(20... 本篇文章极速百科给大家谈谈东风雪铁龙c3xr怎么样,以及2021款东风雪铁龙c3xr对应的知识点,希...
圣诞节的意义(圣诞节的意义讲章... 本篇文章极速百科给大家谈谈圣诞节的意义,以及圣诞节的意义讲章对应的知识点,希望对各位有所帮助,不要忘...
c中getchar表示什么,g... c中getchar表示什么目录c中getchar表示什么getchar在c是什么意思getchar在...
军考网上哪里报名,直招军官的招... 军考网上哪里报名目录军考网上哪里报名直招军官的招录程序是什么?怎样在网上报名考兵2020军校报名时间...
微信红包祝福语8字,发红包祝福... 微信红包祝福语8字目录微信红包祝福语8字发红包祝福语八个字过年红包祝福语微信红包祝福语8字 微信红包...
王字的三横一竖是什么意思,三横... 王字的三横一竖是什么意思目录王字的三横一竖是什么意思三横一竖是什么字?王字的含义是?王的含义是什么王...
精英危险在哪买,精英危险怎么买... 精英危险在哪买目录精英危险在哪买精英危险怎么买船精英危险如何挖矿2022年精英危险值得购买吗精英危险...
尼桑两厢车有哪几款(尼桑两厢车... 本篇文章极速百科给大家谈谈尼桑两厢车有哪几款,以及尼桑两厢车有哪几款红色对应的知识点,希望对各位有所...
端午风俗有哪些传统,端午节有哪... 端午风俗有哪些传统目录端午风俗有哪些传统端午节有哪些习俗?有哪些寓意?端午节的习俗有哪些?端午节的风...
世界十大凶猛龟是哪些,十大凶猛... 世界十大凶猛龟是哪些目录世界十大凶猛龟是哪些十大凶猛龟排名是怎样的?最凶猛的乌龟有哪几种,最猛的三种...
简短情话8个字,很甜很撩的句子... 简短情话8个字目录简短情话8个字很甜很撩的句子八个字 又甜又撩的短句八个字8字爱情名言佳句用八个字形...
高考数学满分多少,高考数学总分... 高考数学满分多少目录高考数学满分多少高考数学总分多少分满分高中考试各科分数是多少?高考数学满分是多少...
吃鸡攻略和技巧手游,手游吃鸡怎... 吃鸡攻略和技巧手游目录吃鸡攻略和技巧手游手游吃鸡怎么练技术绝地求生大逃杀怎么玩 绝地求生各系统玩法技...
开了5年的帝豪后,我换成了奥迪... 今天给各位分享开了5年的帝豪后,我换成了奥迪A4L的知识,其中也会对进行解释,如果能碰巧解决你现在面...
ecco什么牌子,ecco什么... ecco什么牌子目录ecco什么牌子ecco什么牌子 ecco是哪个国家的品牌eoco是什么牌子ec...
汽车内外饰设计-仪表板设计构想... 今天给各位分享汽车内外饰设计-仪表板设计构想-连载05的知识,其中也会对仪表盘内饰进行解释,如果能碰...
酱油生抽老抽有什么区别,生抽老... 酱油生抽老抽有什么区别目录酱油生抽老抽有什么区别生抽老抽酱油有啥区别酱油、生抽、老抽有什么不同?老抽...
北京车牌外地违章怎么处理(北京... 本篇文章极速百科给大家谈谈北京车牌外地违章怎么处理,以及北京牌外地违章本地能处理吗对应的知识点,希望...
13寸电脑尺寸是多少厘米,13... 13寸电脑尺寸是多少厘米目录13寸电脑尺寸是多少厘米13英寸等于多少厘米13寸大概有多大?13.3寸...
管理员的英文缩写是什么,管理员... 管理员的英文缩写是什么目录管理员的英文缩写是什么管理员英文怎么写admn具体指的是什么?管理员的英文...
为什么喊张艺兴孙艺兴,张艺兴为... 为什么喊张艺兴孙艺兴目录为什么喊张艺兴孙艺兴张艺兴为什么叫孙兴?,孙艺兴和张艺兴是同一个人吗为什么喊...