练习项目后端代码解析注解篇(annotation)

news2024/11/25 0:44:09

前言

本来想从接口处入手的,但是一下看到接口里几十个方法,眼睛有点抗拒,想想还是先看作者写的自定义注解吧。
项目里有三个自定义注解:
分别是AccessLimit注解、OperationLogger注解、VisitLogger注解
在这里插入图片描述


AccessLimit注解

这是一个访问控制注解,主要功能是在固定周期内限制访问次数,避免某些恶意访问。

@Target(ElementType.METHOD):说明该注解作用于方法上

@Retention(RetentionPolicy.RUNTIME):注解在运行时仍然存在,可以通过反射读取它的信息

使用时,要传入限制周期和周期内限制次数和提示字符串三个参数,最后一个有默认值可以不需要自己传参。

注意:

在Java中,定义注解(Annotation)时,您需要指定注解的元素(即属性),并且每个元素定义后面都需要加上括号。这是因为注解元素的语法要求。

package com.rawchen.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Description: 访问控制
 * @Date: 2021-04-04
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessLimit {
	/**
	 * 限制周期(秒)
	 */
	int seconds();

	/**
	 * 规定周期内限制次数
	 */
	int maxCount();

	/**
	 * 触发限制时的消息提示
	 */
	String msg() default "操作频率过高";
}

这是项目里该注解的具体运用处,注解规定了30秒内只能访问一下,否则会出现提示信息。提示信息一般是之后通过反射读取出来的,注解本身并不会进行这些逻辑。

在这里插入图片描述


OperationLogger注解

这是一个记录操作日志的注解,也是作用在方法上,运行时保留。
需要传入字符串记录具体操作了什么,不传参的话就是个空字符串。

package com.rawchen.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Description: 用于需要记录操作日志的方法
 * @Date: 2020-11-29
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationLogger {
    /**
     * 操作描述
     */
    String value() default "";
}

这是项目里该注解的具体运用处,方法执行时会记录注解传入的字符串,也就是具体操作,不过这个记录过程不单单是靠注解就能将日志操作写入文件或者数据库的,这个以后再说。
在这里插入图片描述


VisitLogger注解

这个是记录访客操作日志记录的注解,也是作用于方法之上,运行时保留
通过传入两个字符串来记录这个被该注解修饰的方法具体是干什么的,然后再通过反射读取写到日志中去。

package com.rawchen.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Description: 用于需要记录访客访问日志的方法
 * @Date: 2020-12-04
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface VisitLogger {
    /**
     * 访问行为
     */
    String behavior() default "";

    /**
     * 访问内容
     */
    String content() default "";
}

注解看完了

这样看还是很轻松的,看完注解后理所当然的就该看切面了。

因为通常情况下,一个自定义注解会对应一个切面(Aspect)。

在面向切面编程(AOP)中,切面是一种编程范式,它允许开发者定义跨多个对象的横切关注点(cross-cutting concerns),比如日志记录、事务管理、安全检查等。使用注解来标记那些需要横切关注点处理的方法,然后通过切面来实现这些横切关注点的逻辑,是一种非常优雅和高效的方式。

举个例子,上面提到,项目定义了一个名为OperationLogger的注解,用来标记需要记录操作日志的方法。然后,我们就需要可以创建一个切面来拦截所有带有OperationLogger注解修饰的方法,并在这些方法执行前后添加日志记录的逻辑。

这也就是我上面说的单靠注解是无法完成日志记录等逻辑的。

拜拜!

在这里插入图片描述

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

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

相关文章

为什么下载卡在idealTree:NodeJS: sill idealTree buildDeps

可能使用的是npm config set registry https://registry.npm.taobao.org而这个镜像文件已经过期了 解决方法如下: 先使用 npm cache clean --force 清除缓存 再切换镜像源 再使用npm config get registry 进行查看是否换源成功 再使用 npm install -g vue/cli 就…

数据结构算法题day01

积累基本的写代码方式,其实都大同小异 王道、天勤、算法1800题、中选择 【day01】在带头节点的链表中,删除所有值为X的结点,并释放空间。 假设值为X的结点不唯一,试编写算法一实现上述操作。算法思路: a.首先找到x结点…

加速乐 js解混淆 __jsl_clearance_s生成

提示!本文章仅供学习交流,严禁用于任何商业和非法用途,未经许可禁止转载,禁止任何修改后二次传播,如有侵权,可联系本文作者删除! 目标网站 aHR0cHM6Ly9jcmVkaXQuaGVmZWkuZ292LmNuL2NyZWRpdC13…

nginx 启动,查看,停止

nginx 启动,查看,停止 启动 start nginx 查看是否启动成功 tasklist | findstr nginx 停止 nginx -s stop 测试配置文件的语法是否有误 nginx -t 重启nginx nginx-s reload

分享天某云对象存储开发的体验

最近体验了天某云对象存储的功能,作为一名资深开发者,开发体验差强人意,与阿里云存在一定的差距。 首先在开发文档上居然没有基于nodejs的代码示例,只有java,c#,go等的代码示例,虽然有javascript的,但那也只…

面试经验分享 | 蓝队面试经验

关于蓝队面试经验 1.自我介绍能力 重要性 为什么将自我介绍能力放在第一位,实际上自我介绍才是面试中最重要的一点,因为护网面试并没有确定的题目,让面试官去提问 更多是的和面试官的一种 “交谈” ,面试的难易程度也自然就取决…

Kubernetes 教程:在 Containerd 容器中使用 GPU

原文链接:Kubernetes 教程:在 Containerd 容器中使用 GPU 云原生实验室本文介绍了如何在使用 Containerd 作为运行时的 Kubernetes 集群中使用 GPU 资源。https://fuckcloudnative.io/posts/add-nvidia-gpu-support-to-k8s-with-containerd/ 前两天闹得沸沸扬扬的事件不知道…

C++ | Leetcode C++题解之第71题简化路径

题目&#xff1a; 题解&#xff1a; class Solution { public:string simplifyPath(string path) {auto split [](const string& s, char delim) -> vector<string> {vector<string> ans;string cur;for (char ch: s) {if (ch delim) {ans.push_back(mov…

深度学习之基于YOLOv5目标检测可视化系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着深度学习技术的快速发展&#xff0c;目标检测在多个领域中的应用日益广泛&#xff0c;包括…

CMakeLists.txt语法规则:foreach 循环基本用法

一. 简介 cmake 中除了 if 条件判断之外&#xff0c;还支持循环语句&#xff0c;包括 foreach()循环、while()循环。 本文学习 CMakeLists.txt语法中的循环语句。 CMakeLists.txt语法中 有两种 循环实现方式&#xff1a;foreach循环与 while循环。 二. CMakeLists.txt语法规则…

【vue3-pbstar-big-screen】一款基于vue3、vite、ts的大屏可视化项目

vue3-pbstar-big-screen是一款基于vue3、vite、ts的大屏可视化项目&#xff0c;项目已内置axios、sass&#xff0c;如element、echarts等需要自行安装。 屏幕适配方案 本项目主要通过transform: scale()缩放核心区域实现屏幕适配效果 //html <div class"container-wr…

编程算法赛

1偶数累加 2、统计字符的数量 3、计算表达式的值 4、哥德巴赫猜想 5、进制的转换

【一刷《剑指Offer》】面试题 16:反转链表

力扣对应题目链接&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 牛客对应题目链接&#xff1a;反转链表_牛客题霸_牛客网 (nowcoder.com) 核心考点 &#xff1a;链表操作&#xff0c;思维缜密程度。 一、《剑指 Offer》内容 二、分析题目 解题思路&#…

CoPilot 产品体验:提升 OpenNJet 的控制管理和服务提供能力

文章目录 前言系统架构介绍CoPilot 配置CoPilot 插件规范 体验 CoPilot 实例CoPilot: Broker 实例CoPilot: Ctrl 实例 开发其他语言编写的 CoPilot目标主要思路具体实现执行 go 程序代码 功能扩展总结 前言 CoPilot 是 OpenNJet 的一个重要组成部分&#xff0c;它在 Master-Wo…

【QA】Java常见运算符

前言 本文主要讲述Java常见的运算符 运算符的概念 两个基本概念&#xff1a; 运算符&#xff1a;对字面量或者变量进行操作的符号 表达式&#xff1a;用运算符把字面量或者变量连接起来符合java语法的式子就可以称为表达式 示例&#xff1a; int a 10; int b 20; int …

【一看就懂】UART、IIC、SPI、CAN四种通讯协议对比介绍

UART、IIC、SPI、CAN四种通信协议对比 通信方式传输线通讯方式标准传输速度使用场景UARTTX(发送数据线)、RX(接收数据线)串行、异步、全双工115.2 kbit/s(常用)计算机和外部设备通信&#xff08;打印机&#xff09;IICSCL(时钟线)、SDA(数据线)串行、同步、半双工100 kbit/s(标…

HNU-人工智能-实验4-基于Resnet的分类器

前言 本实验是自选实验&#xff0c;可以在给定范围内选择。 我刚刚提交了实验报告&#xff0c;暂时不准备放出我自己的实验报告&#xff0c;大概在截止提交之后我再放。 之所以这么着急写blog&#xff0c;是想便利还没做实验的同学。 如果选择的也是这个“毒蘑菇识别”的分类器…

安卓手机录屏在哪里?教给你3种方法

随着智能手机的普及&#xff0c;录屏功能在日常生活和工作中的需求日益增加。那么安卓手机录屏功能在哪里&#xff1f; 本文将详细介绍3个安卓手机的录屏方法&#xff0c;并分享一些实用技巧&#xff0c;帮助您更好地利用这一功能。 方法一&#xff1a;使用安卓手机自带的录屏…

武汉星起航:自运营团队—亚马逊平台运营典范,优势凸显业绩斐然

武汉星起航电子商务有限公司&#xff0c;作为跨境电商领域的佼佼者&#xff0c;凭借自运营团队多年的深耕经验与对亚马逊市场规则的深刻理解&#xff0c;成功在亚马逊平台开设多家自营店铺&#xff0c;并取得显著成绩。公司月流水达到几百万的辉煌业绩&#xff0c;不仅彰显了其…

基于 OpenHarmony compress 三方件使用指南~

关于 提供了一个轻量级的图像压缩库。将允许您将大照片压缩成小 尺寸的照片&#xff0c;图像质量损失或可以忽略不计 compress 的依赖添加 为你的应用添加 compress-debug.har。将 compress-debug.har 复制到 entry\libs 目录下即可&#xff08;由于 build.gradle 中已经依赖…