Springboot 项目启动时扫描所有枚举并存入缓存(redis)

  • 为什么这么做? 为了springboot 注解属性转换字典方便一点(使用缓存的方式在Springboot 启动时获取字典数据)

  • 在启动时会扫描com.vehicle.manager.core.enumerate包下的所有枚举(包括类中的内部枚举),并取出对应属性以json的方式存入redis

  • 目录结构如下:

image.png

  • RedisUtil可以在RedisUtil获取
  • Springboot 项目启动时的处理都可以参考这个方式
package com.vehicle.manager.core.enumerate;import com.alibaba.fastjson.JSON;
import com.vehicle.manager.core.util.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.annotation.Order;
import org.springframework.core.type.filter.AssignableTypeFilter;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;/*** @author zr 2024/3/15*/
@Component
@Order(1) // 确保在其他 Bean 初始化之前执行
@Slf4j
public class EnumScanner implements ApplicationListener<ContextRefreshedEvent> {@Autowiredprivate ApplicationContext applicationContext;private StringRedisTemplate redisTemplate;@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {if (event.getApplicationContext().equals(applicationContext)) {this.redisTemplate = applicationContext.getBean(StringRedisTemplate.class);scanEnums();}}public void scanEnums() {
//        String dicDataStr = RedisUtil.StringOps.get("dicData");
//        if (ObjectUtils.isNotEmpty(dicDataStr)){
//            return;
//        }String packageName = "com.vehicle.manager.core.enumerate"; // 替换成你要扫描的包路径ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);scanner.addIncludeFilter(new AssignableTypeFilter(Enum.class));Set<BeanDefinition> candidateComponents = scanner.findCandidateComponents(packageName);HashMap<String, Map<String, String>> dicData = new HashMap<>();for (BeanDefinition candidateComponent : candidateComponents) {String className = candidateComponent.getBeanClassName();// 这里可以对枚举类进行处理,比如输出类名或者其他操作
//            log.info("Found enum class: " + className);Class<?> enumClass = null;try {enumClass = Class.forName(className);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}if (enumClass.isEnum()) {Map<String,String> dic = new LinkedHashMap();Object[] enumConstants = enumClass.getEnumConstants();for (Object enumConstant : enumConstants) {
//                    log.info("enumConstant",enumConstant);dic.put(enumConstant.toString(),getDesc(enumConstant));}String simpleName = enumClass.getSimpleName();String key = simpleName.substring(0, 1).toLowerCase() + simpleName.substring(1);dicData.put(key,dic);}
//            dicData.put(key, JSON.toJSONString());}RedisUtil.StringOps.set("dicData", JSON.toJSONString(dicData));}private static  String  getDesc(Object enumConstant) {try {Field descField = enumConstant.getClass().getDeclaredField("desc");descField.setAccessible(true);String methodName = "get" + descField.getName().substring(0, 1).toUpperCase() + descField.getName().substring(1);Method getDescMethod = enumConstant.getClass().getMethod(methodName);return (String) getDescMethod.invoke(enumConstant);} catch (Exception e) {e.printStackTrace();return null;}}
}

存入redis中的数据结构如下:

  • json中的key为枚举的名称首字母小写
  • 当然用redis的hash结构存储更好,当时开发时没有考虑到,有需要的可以自己改造

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/30740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elasticsearch的入门与实践

Elasticsearch是一个基于Lucene构建的开源搜索引擎。它提供了一个分布式、多租户能力的全文搜索引擎&#xff0c;具有HTTP web接口和无模式的JSON文档。以下是Elasticsearch的入门与实践的基本步骤&#xff1a; 入门 安装Elasticsearch&#xff1a; 从Elasticsearch官网下载对…

DLT645电表数据 转IEC104项目案例

案例说明 设置网关采集DLT645电表数据数据把采集的数据转成IEC104协议转发给其他系统。 VFBOX网关工作原理 VFBOX网关是协议转换网关&#xff0c;是把一种协议转换成另外一种协议。网关可以采集西门子&#xff0c;欧姆龙&#xff0c;三菱&#xff0c;AB PLC&#xff0c;DLT64…

南开大学漏洞报送证书【文尾有福利】

证书介绍 获取来源&#xff1a;edusrc&#xff08;教育漏洞报告平台&#xff09; url&#xff1a;教育漏洞报告平台(EDUSRC) 兑换价格&#xff1a;30金币​ 获取条件&#xff1a;南开大学任意中危或以上级别漏洞 证书规格&#xff1a;证书做了木框装裱&#xff0c;显得很高…

【哈尔滨等保测评:金融行业安全的钢铁长城】

在当今高度信息化的社会中&#xff0c;网络安全已成为各行各业不可忽视的关键议题&#xff0c;尤其对于金融行业而言&#xff0c;信息安全更是至关重要的生命线。哈尔滨市作为东北地区的重要经济枢纽&#xff0c;其金融行业在享受数字化转型带来的便利与效率的同时&#xff0c;…

常量池你了解多少

第1部分&#xff1a;引言 JVM简介 Java虚拟机&#xff08;JVM&#xff09;是一个可以执行Java字节码的虚拟计算机。它是Java平台的核心组成部分&#xff0c;允许Java程序在不同的操作系统和硬件平台上运行。JVM不仅提供了内存管理、垃圾回收等基础服务&#xff0c;还支持多种…

我工作中用Redis的10种场景

Redis作为一种优秀的基于key/value的缓存&#xff0c;有非常不错的性能和稳定性&#xff0c;无论是在工作中&#xff0c;还是面试中&#xff0c;都经常会出现。 今天这篇文章就跟大家一起聊聊&#xff0c;我在实际工作中使用Redis的10种场景&#xff0c;希望对你会有所帮助。 …

逆向学习Windows篇:C++中多线程的使用和回调函数的实现

本节课在线学习视频&#xff08;网盘地址&#xff0c;保存后即可免费观看&#xff09;&#xff1a; ​​https://pan.quark.cn/s/385577c66515​​ 在Windows环境下&#xff0c;C是一种强大的编程语言&#xff0c;它不仅支持面向对象编程&#xff0c;还提供了对系统级编程的直…

竞赛选题 python opencv 深度学习 指纹识别算法实现

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python opencv 深度学习 指纹识别算法实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;4分创新点&#xff1a;4分 该项目较为新颖…

java干货 线程间通信

文章目录 一、线程间通信1.1 为什么要处理线程间通信&#xff1f;1.2 什么是等待唤醒机制&#xff1f; 二、等待唤醒机制使用2.1 等待唤醒机制用到的方法2.1.1 wait2.1.2 notify 2.2 线程通信代码实践2.2.1 重要说明2.2.2 代码 一、线程间通信 1.1 为什么要处理线程间通信&…

windows系统使用nvidia-smi命令办法

参考&#xff1a; https://blog.csdn.net/Castlehe/article/details/114978005 老版本的cuda&#xff0c;nvidia-sim.exe这个软件是位于&#xff1a;C:\Program Files\NVIDIA Corporation\NVSMI 新版本的cuda&#xff08;比如cuda11.0&#xff09;&#xff0c;nvidia-sim.exe这…

springBoot高校宿舍交电费系统-计算机毕业设计源码031552

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

忘记 iPhone 密码:如果忘记密码,如何解锁 iPhone

为了提高个人数据的安全性&#xff0c;用户通常会为不同的帐户和设备创建不同的复杂密码。虽然较新的 iPhone 型号具有生物识别和面部解锁功能&#xff0c;但这些功能并不总是有效 - 如果您忘记了 iPhone 的密码&#xff0c;您可能会遇到麻烦。 iPhone 用户和 Android 用户一样…

MYSQL 四、mysql进阶 4(索引的数据结构)

一、为什么使用索引 以及 索引的优缺点 1.为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构&#xff0c;就好比一本教科书的目录部分&#xff0c;通过目录中找到对应文章的页码&#xff0c;便可快速定位到需要的文章。Mysql中也是一样的道理&#xff0c;进行数…

2024-06-19 高等数学(统计学和概率论-高等工科数学)

学习数学时&#xff0c;有效的笔记方法可以帮助你更好地理解和记忆概念、公式和解题技巧。下面是一个数学笔记的基本模本&#xff0c;你可以根据自己的需求进行调整&#xff1a; 1. **标题**&#xff1a;写上日期和课程名称&#xff0c;例如“2024-06-19 高等数学”。 2. **课…

PyFlink

PyFlink教程 官方文档链接 PyFlink官方文档 概述 PyFlink是Apache Flink的Python API&#xff0c;允许用户使用Python编写数据处理程序。Flink是一种用于处理无界和有界数据流的分布式流处理框架。PyFlink可以帮助用户轻松地在Flink集群上运行Python数据流处理任务。 架构…

办公人必备宝藏网站,提升工作效率!

对于每个办公人来说&#xff0c;如何在繁杂的工作中保持高效&#xff0c;是每位职场人士追求的目标。其中&#xff0c;高效的工具和资源可以极大地提升我们的工作效率。下面小编就来和大家分享一些办公人必备的宝藏网站&#xff0c;提升大家的工作效率。 1. 办公人导航 办公人…

反激开关电源变压器设计2

实际计算 已知 Vin&#xff1a;AC176-264V Vo&#xff1a;5V Io2A Vmax264V*根号2373V PoVo*Io10W η0.8 PinPo/η12.5W DCM变压器&#xff0c;在开关电源的整个输入电压范围内满载工作时都工作在断续模式 CCM变压器&#xff0c;在开关电源的整个输入电压范围内满载工作时都工…

小程序开发的技术难点

小程序开发是一项技术难度较高的工作&#xff0c;需要开发者具备多方面的知识和技能&#xff0c;小程序开发的技术难点主要体现在以下几个方面。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 多端兼容 小程序需要在微信、支付宝…

渗透测试基础(五) 获取WiFi密码

1. 前提条件 需要无线网卡&#xff0c;kali无法识别电脑自带的网卡。 2. 实验步骤&#xff1a; 2.1 查看网卡 命令&#xff1a;airmon-ng 2.2 启动网卡监听模式 命令airmon-ng start wlan0 检查下是否处于监听模型&#xff1a;ifconfig查看一下&#xff0c;如果网卡名加…

ARM64汇编0C - inlinehook

本文是ARM64汇编系列的完结篇&#xff0c;主要利用前面学过的知识做一个小实验 完整系列博客地址&#xff1a;https://www.lyldalek.top/article/arm 这里只讨论 ARM64 下的 inlinehook&#xff0c;做一个简单的demo&#xff0c;只是抛砖引玉&#xff0c;有兴趣了解更多细节的可…