springboot项目 字典/枚举翻译 终极解决方案 AOP+自定义注解+递归实体字段+实体动态三级缓存+责任链+多种转换方式

目录

  • 前言
  • 实现思路
    • 技术确定
  • 食用方式
    • 效果
    • 使用样例
    • 项目中使用
      • 第一步 复制包
      • 第二步 实现LoadDictDatabase并将其注入容器
      • 第三步 标识需要翻译的字段
      • 第四步 标识需要翻译的方法
      • 第五步 调用需要翻译的方法
  • 实现细节
  • TODO

前言

字典,即在存储介质中进行存储时,为了避免业务上对其名称的调整,所以存储其编码,在进行展示时,将其中文展示出来.我了解到,早期还有中可能是: 存储中文时,有编码问题. 不过我觉得这种说法无法成立,如果面向的用户是中国用户,系统就不可能不存中文.

我的这种实现方式,不仅帮组实现了字典翻译的业务, 还用到了设计模式和一些技术,二次拓展方便,值得一学.

实现思路

技术确定

在展示时,将字典翻译成显示值,那什么时候翻译呢? 有一种说法是将字典对应的编码返回到前端,让前端展示的时候再翻译. 但是这样我想到了两个问题

  1. 后端在业务上中有可能也需要使用中文名称的, 比如生成文件,根据业务信息生成Word文件、PDF文件等等
  2. 字典的缓存处理,前端如何存储系统的字典,如何刷新缓存呢?我对前端不太了解,但是后端显而易见的处理方式是用redis

在我一步一步的尝试和完善下,最终落地的方案是:

  • 后端翻译

  • AOP+自定义注解: 精确指定需要翻译的字段和方法

  • 动态三级缓存: 模拟经典的 '高速缓存-内存-硬盘’三级缓存,实现了’内存-redis-数据库’三级缓存链,并且redis不是必须的,可以根据项目中是否引入,来动态的组装缓存链.当redis未使用时,会自动组装成’内存-数据库’两层缓存链

  • 多种转换方式: 有三种: 指定数据库(或redis或程序内存)中的字典、指定程序中已有的枚举类、手动指定

  • 责任链: 在这小小枚举翻译中,有两处用到了责任链: 命中的缓存和翻译的方式

    • 命中的缓存: 根据缓存链构建的顺序,如果当前级别命中不到,会丢给下一级缓存,如果在下一级找到了,还会缓存到本级. 下一级的处理逻辑也是如此,直到找到了缓存, 或者全都没找到缓存,返回源字典编码

食用方式

效果

先上效果图,在实体上配置如下
三种翻译方式
最后翻译出的结果如下
翻译结果

使用样例

源码地址: gitee源码

源码中的spring-ordinary项目,有字典翻译的源码和使用样例,
字典源码: com.ql.ordinary.common.dict包中
使用样例: com.ql.ordinary.rest.DictConvertTestController

如果需要需要查看样例效果,需要以下步骤

  • 拉取源代码
  • 更改配置文件中的mysql配置和redis配置
  • 在mysql指定的库中执行spring-ordinary/db/sys-dict.sql脚本
  • 启动服务
  • 调用接口: http://localhost:6660/dict/convert/student/list

如果以上步骤都能成功,那么将看到效果图的的样子

项目中使用

在自己项目中使用,需要如下步骤

第一步 复制包

拉取源代码并复制包. 源码地址: gitee源码

现在只有一种使用方式: 将 com.ql.ordinary.common.dict整个包中的类复制到自己的项目中, 后续会考虑做成starter或者放到maven公共仓库中
如果没有使用redis,

  • 删除项目中引用的redis相关类
  • 取消RedisDictCache的注入

第二步 实现LoadDictDatabase并将其注入容器

com.ql.ordinary.common.dict.service.LoadDictDatabase接口中定义了从数据库中获取字典的方法, 不关心你是怎么从数据库中获取, 也不关心是从什么数据库中获取的. 只需要通过这个接口获取结果

第三步 标识需要翻译的字段

Dict 注解用来标识需要翻译的字段,有多种翻译方式. 详见类上的注释

第四步 标识需要翻译的方法

DictMethod注解用来标识需要翻译的方法,如果没有标识方法,只标识字段,也是没用的.

第五步 调用需要翻译的方法

调用被DictMethod标识的方法,拿到的结果就是被翻译了的结果

实现细节

待补充

TODO

  1. 做成一个starter或者放到公共的maven仓库中
  2. 支持对map的翻译,

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

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

相关文章

【网站项目】SpringBoot803房屋租赁管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Day 28 MySQL的数据备份与恢复

数据备份及恢复 1.概述 ​ 所有备份数据都应放在非数据库本地,而且建议有多份副本 备份: 能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方 冗余: 数据有多份冗余,但不等备份&…

【JUC】并发编程 Synchronized 锁升级原理

Synchronized如何实现同步/互斥的效果? monitorenter: 将锁对象对象头中Mark Word的前30bit替换成指向操作系统中与其关联的monitor对象,将锁记录位状态改为10 monitorexit: 将锁对象对象头中Mark Word进行重置,重新恢…

代码随想录——二叉树的层序遍历(Leetcode102)二叉树层序遍历的模板

题目链接 层序遍历(队列) 层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。 需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用…

数据分享—全国分省河流水系

河流水系数据是日常研究中必备的数据之一,本期推文主要分享全国分省份的水系和河流数据,梧桐君会不定期的更新数据,欢迎长期订阅。 数据预览 山东省河流水系 吉林省河流水系 四川省河流水系 数据获取方式 链接:https://pan.baidu.…

# 电脑突然连接不上网络了,怎么办?

电脑突然连接不上网络了,怎么办? 一、原因分析: 1、IP 地址冲突 2、DNS 解析出现问题。 3、电脑网络设置是否打开了【移动热点】或【飞行模式】。 4、【WLAN AutoConfig】服务是否打开。 5、无线网卡驱动损坏。 6、检查 WIFI 开关是否…

【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”

看到这句话的时候证明:此刻你我都在努力~ 加油陌生人~ 个人主页: Gu Gu Study ​​ 专栏:一步一步了解Java 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努…

远程调用feign的使用

在orderservice子工程中 <!--feign的远程--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>启动类加上这个注解 EnableFeignClients //自动装配…

STM32系统架构

以下是STM32系统架构中的各个重要组件和功能&#xff1a; 组件描述Cortex-M内核ARM Cortex-M系列内核&#xff0c;如M0、M0、M3、M4、M7等Flash存储器存储程序代码和数据SRAM存储程序运行时数据和堆栈外设接口GPIO、SPI、I2C、UART、TIM、ADC、DAC、USB、CAN、Ethernet等时钟和…

微信小程序按钮去除边框线

通常我们去掉按钮边框直接设置 border:0 但是在小程序中无效&#xff0c;设置outline:none也没用&#xff0c;当然可能你会说加权重&#xff1b;试过了无效 实际上该样式是在伪元素::after内&#xff0c;主要你检查css 还看不到有这个关系&#xff0c;鹅厂就是坑多 类样式::…

在家中访问一个网站的思考

在家中访问一个网站的思考 1、家庭网络简介2、家庭WLAN DHCP2.1、家庭路由器PPPOE拨号2.2、DHCP&#xff08;动态主机配置协议&#xff09;2.3、接入家庭网的主机IP地址2.4、家庭总线型以太网2.5、以太网协议MAC地址2.6、ARP协议2.7、IP协议 & UDP/TCP协议2.8、NAT&#x…

【基于 PyTorch 的 Python 深度学习】6 视觉处理基础:卷积神经网络(2)

前言 文章性质&#xff1a;学习笔记 &#x1f4d6; 学习资料&#xff1a;吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2 主要内容&#xff1a;根据学习资料撰写的学习笔记&#xff0c;该篇主要介绍了卷积神经网络的池化层部分和现代经典网络。…

【c++】set、map用法详解

set、map用法详解 1. 关联式容器2. 键值对2.1 &#xff1a;pair2.2&#xff1a;make_pair 3. 树形结构的关联式容器3.1&#xff1a;set构造函数find()erase()insert()count()lower_bound()upper_bound() 3.2&#xff1a;multiset3.3&#xff1a;map构造函数insert()operator[] …

47.乐理基础-音符的组合方式-连线

连线与延音线长得一模一样 它们的区别就是延音线的第三点&#xff0c;延音线必须连接相同的音 连线在百分之九十九的情况下&#xff0c;连接的是不同的音&#xff0c;如下图的对比&#xff0c;连线里的百分之1&#xff0c;以现在的知识无法理解&#xff0c;后续再写 在乐谱中遇…

【计算机网络】计算机网络概述、计算机网络性能指标 习题1

0 1. 计算机网络可被理解为( )。 A.执行计算机数据处理的软件模块 B. 由自治的计算机互连起来的集合体 C.多个处理器通过共享内存实现的紧耦合系统 D. 用于共同完成一项任务的分布式系统 0 2.计算机网络最基本的功能是( )。 A.数据通信 B. 资源共享 C. 分布式处理 D. 信息综合…

Github的使用教程(下载项目、寻找开源项目和上传项目)

根据『教程』一看就懂&#xff01;Github基础教程_哔哩哔哩_bilibili 整理。 1.项目下载 1&#xff09;直接登录到源码链接页或者通过如下图的搜索 通过编程语言对搜索结果进一步筛选。 如何去找开源项目&#xff1a;(Github 新手够用指南 | 全程演示&个人找项目技巧放…

js原型链与继承笔记

前置阅读&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain js中的“类”是一个函数。function test() {}中&#xff0c;test是由Function生成的。prototype与__proto__的区别&#xff1a; 前者是js函数&#xff08;C…

零基础学MySQL

1. 零基础学MySQL 1.1 数据库简介 1.1.1 数据库三层结构 1. 所谓安装Mysql数据库&#xff0c;就是在主机安装一个数据库管理系统(DBMS)&#xff0c;这个管理程序可以管理多个数据库。DBMS(database manage system) 2. 一个数据库中可以创建多个表,以保存数据(信息)。 3. 数据…

网络工程师练习题

网络工程师练习题 网桥怎样知道网络端口连接了那些网站?如果从端口收到一个数据帧,则将其源地址记入该端口的数据库当网桥连接的局域网出现环路时怎么办?运行生成树协议阻塞一部分端口。使用IEEE 802.1q协议,最多可以配置4094个VLAN。VLAN中继协议(VTP)有不同的工作模式,…

深度学习--DCGAN

代码之后的注释和GAN的一样&#xff0c;大家如果已经掌握GAN&#xff0c;可以忽略掉哦&#xff01;&#xff01;&#xff01; 在学习DCGAN之前&#xff0c;我们要先掌握GAN&#xff0c;深度学习--生成对抗网络GAN-CSDN博客 这篇博客讲的就是GAN的相关知识&#xff0c;还是很详…