开源新项目Auto-Annotation,这你不了解一下

news2024/9/20 22:26:35

logo

Auto-Annotation

一个注解实现对业务功能增强的注解集


项目简介

​ 项目源码开源地址:点这里

​ 对业务开发过程中经常遇见的一些通用场景进行注解封装,形成一系列比较通用的注解集,来满足日常开发需要。注解集随业务拓展不断更新中,欢迎您的补充…

                  _                                     _        _   _
       /\        | |            /\                     | |      | | (_)
      /  \  _   _| |_ ___      /  \   _ __  _ __   ___ | |_ __ _| |_ _  ___  _ __
     / /\ \| | | | __/ _ \    / /\ \ | '_ \| '_ \ / _ \| __/ _` | __| |/ _ \| '_ \
    / ____ \ |_| | || (_) |  / ____ \| | | | | | | (_) | || (_| | |_| | (_) | | | |
   /_/    \_\__,_|\__\___/  /_/    \_\_| |_|_| |_|\___/ \__\__,_|\__|_|\___/|_| |_|

:: Project Version 1.0.0 :: auto-annotation:druid :: Running SpringBoot 2.6.5 :: 

项目引用

​ 该项目已上传至Maven中央仓库,使用者可直接引用

<dependency>
    <groupId>io.github.lindaifeng</groupId>
    <artifactId>auto-annotation</artifactId>
    <version>1.0.0</version>
</dependency>

技术实现

环境配置

运行环境JDK1.8

开发工具: IdeaMaven

默认已启动中间件:Mysql8.0Redis

主要功能点展示

  • 数据脱敏篇 @SensitiveFiled
  • 参数校验篇 @MockValidator
  • 防重复提交篇 @RepeatSubmit
  • 接口限流篇 @RateLimit
  • 强制登录篇 @LoginRequired
  • 日志记录篇 @OperateLog
  • 动态数据源篇 @DynamicDb
  • 数据加密篇 @EncryptionFields

数据脱敏篇

本文链接:点这里

​ 在日常业务开发中,我们会接触到各种各样的数据,这些数据可能包含用户敏感信息。如果这些敏感信息在传输和存储过程中被泄露,将会给用户带来不必要的麻烦和安全隐患。因此,数据脱敏技术的应用变得越来越重要。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveFiledSerialize.class)
public @interface SensitiveFiled {

    /**
     * 脱敏实现类
     */
    Class<? extends ISensitiveTypeStrategy> using();
    /**
     * 脱敏前缀位数(自定义脱敏使用)
     */
    int prefixHideLen() default 0;
    /**
     * 脱敏后缀位数(自定义脱敏使用)
     */
    int suffixHideLen() default 0;
    /**
     * 脱敏符号(自定义脱敏使用)
     */
    String symbol() default "*";

}

参数校验篇

本文链接:点这里

​ API开发中经常会遇到一些对请求数据进行验证的情况,常规操作是不是在代码中进行if判断是否参数为空?这样显得很不优雅,这时候如果使用注解就有两个好处,一是验证逻辑和业务逻辑分离,代码清晰,二是验证逻辑可以轻松复用,只需要在要验证的地方加上注解就可。

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = MockValidatorImpl.class)
public @interface MockValidator {
    /**
     * 校验响应信息
     */
    String message() default "xxx校验不通过";

    /**
     * 校验分组
     */
    Class<?>[] groups() default {};

    /**
     * 自定义校验负载信息
     */
    Class<? extends Payload>[] payload() default {};

}

防重复提交篇

本文链接:点这里

​ 在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,表单重复提交在日常 Web 应用中是最常见且带来麻烦最多的一个问题。

​ 有很多的应用场景都会遇到表单重复提交问题,比如由于用户误操作,多次点击表单提交按钮;由于网速等原因造成页面卡顿,用户重复刷新提交页面,甚至会有黑客或恶意用户使用工具重复恶意提交表单来对网站进行攻击,这就造成请求发送多次,引发数据混乱,数据重复等问题,所以说防止表单重复提交在 Web 应用中的重要性是极高的。

@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RepeatSubmit {
    /**
     * 间隔时间(ms),小于此时间视为重复提交
     */
    int interval() default 5000;

    /**
     * 提示消息
     */
    String message() default "不允许重复提交,请稍后再试";
}

接口限流篇

本文链接:点这里

​ 在访问高峰期为保证应用服务稳定运行,需要对高并发场景下接口进行接口限流处理,通对接口流量的访问限制能够在一定程度上防止接口被恶意调用的情况出现。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimit {
    /**
     * 限流key
     */
    String key() default "rate_limit_key:";

    /**
     * 限流时间,单位秒
     */
    int time() default 60;

    /**
     * 限流次数
     */
    int count() default 100;

    /**
     * 限流类型
     */
    RateLimitTypeEnum limitType() default RateLimitTypeEnum.GLOBAL;
}

强制登录篇

本文链接:点这里

​ 最近在一些业务场景中遇到这样的需求,有些接口需要登录后才能访问。我思考了一下,自定义注解的使用 注解+拦截器 实现登录校验,项目中在进入方法之前判断用户是否登录、登录了则继续执行方法,未登录则返回异常信息,或许是一个很不错的方法,当然类似黑名单的方式也可以,适合自己的最好。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoginRequired {

}

日志记录篇

本文链接:点这里

​ 平时开发中,我们经常需要通过日志或者数据库来记录系统中一些重要的操作,如删除、修改和新增等。但每次在这些方法里手动打印日志或者记录到数据库太过繁琐,并且在代码中看到好多日志打印语句一点都不优雅。

​ 通过自定义注解统一收集日志的方式来实现,则不需要在代码中考虑日志打印的问题,只需要在接口上打一个注解即可。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(OperateLogs.class)
public @interface OperateLog {

    /**
     * 业务id
     */
    String bid();
    /**
     * 日志标签
     */
    String tag();
    /**
     * 操作类型
     */
    OperateTypeEnum operateType();
    /**
     * 日志消息
     */
    String message() default "";
    /**
     * 操作人员
     */
    String operatorId() default "";
    /**
     * 是否记录结果值
     */
    boolean recordResult() default false;
    /**
     * 结果值
     */
    String result() default "";
    /**
     * 是否在方法执行后记录(默认方法执行前记录)
     */
    boolean after() default false;

}

动态数据源篇

本文链接:点这里

​ 通常一个系统只需要连接一个数据库就可以了。但是在企业应用的开发中往往会和其他子系统交互,特别是对于一些数据实时性要求比较高的数据,我们就需要做实时连接查询,而不是做同步。这个时候就需要用到多数据源。

​ 举个例子,在主从数据库的业务场景中,一个库用来读,一个库用来写,那么在进行数据库读写操作时就需要进行数据库的切换。

@Target({ ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DynamicDb {
    /**
     * 切换数据库源
     */
    DbType value() default DbType.PRIMARY_DB;
}

数据加密篇

本文链接:点这里

​ 前段时间在做密码测评时,遇到一个这样的业务场景,业务系统中的数据需要进行加密存储,在数据传输过程中进行加密传输。这就麻烦了,这数据可不光要加密,肯定也要解密呀,这再加上个传输加解密以及存储加解密,想想都麻烦,于是便想有什么办法能够写一套通用的代码来处理这种业务场景呢。

​ 力求便捷,最先想到的便是自定义注解了,那么我能不能通过定义一个注解来标识哪些接口需要加解密传输,哪些字段需要加解密存储呢。于是数据加密篇便油然而生。

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EncryptionFields {
    /**
     * 是否将接收到的参数解密存储
     */
    boolean decryptStorage() default false;
    /**
     * 是否将接收到的参数加密存储
     */
    boolean encryptStorage() default false;

    /**
     * 是否将查询到的结果解密返回
     */
    boolean decryptReturn() default false;
    /**
     * 是否将查询到的结果加密返回
     */
    boolean encryptReturn() default false;
}	

总结

​ 本项目为个人在闲暇之余的初创项目,代码结构总体比较简单易懂,内含详细的注释,非常适合新手以及无该业务场景经验者学习。

​ 如果在使用过程中发现bug,或者你有一个很不错的自定义注解想法,欢迎给我提issues,我将会采用你的意见一起来丰富这个项目。

​ 如果本项目对你有些帮助,欢迎给我一个🌟🌟🌟star🌟🌟🌟,让更多人知道它的存在,这对我很重要 。

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

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

相关文章

Qt6 第一天认识基本模块、附加模块、支持的平台、QML用户界面

文章目录 Qt6 焦点Qt6 核心-基本模块Qt6 附加模块Qt6 支持的平台Qt6 简介Qt6 消化用户界面 Qt6 焦点 Qt 5在很多年前发布&#xff0c;引入了一种新的声明方式来编写令人惊叹的用户界面。从那时起&#xff0c;我们周围的世界发生了很大的变化。 Qt 6将是Qt 5的延续&#xff0c;不…

插值查找(思路+代码)

变量和二分查找差不多&#xff0c;但是公式变了 公式&#xff1a; int mid left (right - left) * (indexValue -arr[left]) / ( arr[right] - arr[left]) 注意事项&#xff1a; 适用于数据量比较大&#xff0c;数据分布均匀的数据 代码&#xff1a; package search;impor…

回归预测 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络的数据多输入单输出回归预测

回归预测 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络的数据多输入单输出回归预测 目录 回归预测 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 回归预测 | MATLAB实现WOA-CNN鲸鱼算法优化卷积…

34.RocketMQ之Broker端消息存储流程详解

highlight: arduino-light Broker消息存储概要设计 RocketMQ主要存储的文件包括Commitlog文件&#xff0c;ConsumeQueue文件&#xff0c;IndexFile文件。 RMQ把所有主题的消息存储在同一个文件中&#xff0c;确保消息发送时顺序写文件。 为了提高消费效率引入了ConsumeQueue消息…

Android studio 引入不了R包,手动引入显示红色。可以跑起来却没问题

之前在这个问题踩坑2次&#xff0c;遂记录一下。 问题是&#xff1a;工程里找不到自己包名的R&#xff0c;手动导入显示红色&#xff0c;Run起来倒是没问题 尝试过Clean&#xff0c;Rebuild&#xff0c;清缓存&#xff0c;重启&#xff0c;都没用。 最终发现是没有在 Android…

gitlab:(二)gitlab注册用户和邀请进入项目的问题

.新注册用户无法在管理员界面激活 在管理员界面无法进行管理&#xff0c;找不到相关的操作界面 当前gitlab版本 尝试降低gitlab版本 卸载之后删除残留文件 安装指定的低版本&#xff1a;gitlab-ce-12.7.5-ce.0.el7.x86_64.rpm yum install policycoreutils openssh-server op…

网络应用基础ENSP环境的安装(NETBASE第三课)

网络应用基础ENSP环境的安装(NETBASE第三课) eNSP(Enterprise Network Simulation Platform)是一款由华为提供的、可扩展的、图形化操作的网络仿真工具平台&#xff0c;主要对企业网络路由器、交换机进行软件仿真&#xff0c;完美呈现真实设备实景&#xff0c;支持大型网络模拟…

Markdown编辑器Vditor的基本使用以及在Vue3中使用

介绍 官网 GitHub 帮助文档 Vditor是一个Markdown编辑器组件&#xff08;也支持富文本编辑器&#xff09;&#xff0c;可以嵌入到自己的Web应用中。 此Markdown编辑器支持三种模式&#xff08;几乎没有一个Markdown编辑器同时支持这三种模式&#xff09;&#xff1a; 所见即所…

基于matlab消除视频流中摄像机运动的影响(附源码)

一、前言 此示例演示如何从视频流中删除摄像机运动的影响。 在此示例中&#xff0c;我们首先定义要跟踪的目标。在这种情况下&#xff0c;它是汽车的后部和车牌。我们还建立了一个动态搜索区域&#xff0c;其位置由最后一个已知的目标位置确定。然后&#xff0c;我们仅在此搜…

ChatGPT引导下的编程起航:零基础学会Python编程(ChatGPT版)

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言如何使用 ChatGPT对…

【C++】C++11之线程库

一、thread类 在 C11 之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如 windows 和 linux 下各有自己的接 口&#xff0c;这使得代码的可移植性比较差 。 C11 中最重要的特性就是对线程进行支持了&#xff0c;使得 C 在 并行编程时不需要依赖第三…

刚发offer,明天就让上班!原公司离职手续还没办,说晚两天报到,hr竟取消offer,录用其他人!...

这年头找工作有多难&#xff1f;一位网友吐槽&#xff1a;一瞬间从天堂掉进地狱&#xff01; 楼主说&#xff0c;hr今天刚发了offer&#xff0c;就让明天来上班。自己说明天不可能&#xff0c;原公司离职手续还没办完&#xff0c;hr就取消了offer&#xff0c;转而录用了其他候选…

MySQL基本查询与内置函数

目录 聚合函数 分组查询 内置函数 日期函数 字符串函数 数学函数 聚合函数 COUNT&#xff1a;返回查询到的数据的数量 SUM&#xff1a;返回查询到的数据的总和&#xff08;数字&#xff09; AVG&#xff1a;返回数据的平均值 MAX&#xff1a;返回查询到的数据的最大值 MIN&a…

毫米波雷达系列 | 毫米波雷达测角原理-补档

毫米波雷达测角原理 角度分辨率 当估算角度分辨率最少需要两个RX天线&#xff0c;利用的是物体相对每个天线的差分距离。 假设雷达具有一个发射天线TX和两根接受天线RX1和RX2之间的间距为d&#xff0c; θ \theta θ为目标相对天线的角度&#xff0c;那么接受天线之间的相位…

OpenCV 入门教程:颜色空间转换

OpenCV 入门教程&#xff1a;颜色空间转换 导语一、颜色空间的基本概念1.1 RGB颜色空间1.2 灰度颜色空间1.3 其他颜色空间 二、颜色空间转换三、示例应用3.1 提取图像的色彩通道3.2 调整图像的亮度和对比度 总结 导语 在图像处理和计算机视觉领域&#xff0c;颜色空间转换是一…

学无止境·MySQL③

单表查询 题一创建表并插入数据薪水修改为5000将姓名为张三的员工薪水修改为3000元将姓名为李四的员工薪水修改为4000元&#xff0c;gener改为女 题一 1.创建表&#xff1a; 创建员工表employee&#xff0c;字段如下&#xff1a; id&#xff08;员工编号&#xff09;&#xff…

CVE 官网提交流程

CVE 官网提交流程 一、进入官网申请 https://cveform.mitre.org/ 选择申请CVE ID即可。 Vulnerability type翻译&#xff08;chatgpt-3.5&#xff09;buffer overflow缓冲区溢出是一种软件漏洞&#xff0c;攻击者在向缓冲区写入超出其容量的数据时&#xff0c;可能导致数据覆…

一文搞懂常见的加密算法

加密算法在互联网技术领域中几乎是无处不在&#xff0c;而密码学也是网络安全的重要基础&#xff0c;这篇文章我们就一起来学习下常见的加密算法。 1 为什么要研究加密算法&#xff1f; 在技术方面&#xff0c;加密算法的研究具有重要的意义&#xff0c;主要体现在以下几个方…

【LeetCode】HOT 100(25)

题单介绍&#xff1a; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数据结构的新手和想要在短时间内高效提升的人&#xff0c;熟练掌握这 100 道题&#xff0c;你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

从零开始 Spring Boot 66:JPA 查询参数

从零开始 Spring Boot 66&#xff1a;JPA 查询参数 图源&#xff1a;简书 (jianshu.com) JPA 的查询参数分为两种&#xff1a; 命名参数&#xff08;Named Parameters&#xff09;位置参数&#xff08;Positional Parameters&#xff09; 类似于 Python 中的函数的位置参数和…