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

前言

本来想从接口处入手的,但是一下看到接口里几十个方法,眼睛有点抗拒,想想还是先看作者写的自定义注解吧。
项目里有三个自定义注解:
分别是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注解修饰的方法,并在这些方法执行前后添加日志记录的逻辑。

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

拜拜!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫教程:入门爬取网页数据

1.遵守法律法规 爬虫在获取网页数据时,需要遵守以下几点,以确保不违反法律法规: 不得侵犯网站的知识产权:爬虫不得未经授权,获取和复制网站的内容,这包括文本、图片、音频、视频等。 不得违反网站的使用条…

PXE远程部署CentOS系统

文章目录 在局域网内搭建PXE服务器PXE 启动组件PXE的优点实验一、搭建PXE服务器,实现远程部署CentOS系统环境准备server关闭防火墙安装组件准备 Linux 内核、初始化镜像文件及PXE引导文件配置启用TFTP 服务配置启动DHCP服务准备CentOS 7 安装源配置启动菜单文件 Cli…

【C 数据结构-动态内存管理】3. 伙伴系统管理动态内存

文章目录 【 1. 伙伴系统的结构设计 】【 2. 分配算法 】【 3. 回收算法 】 伙伴系统 本身是一种动态管理内存的方法,和边界标识法的区别是:使用伙伴系统管理的存储空间,无论是空闲块还是占用块,大小都是 2 的 n 次幂(…

AI换脸免费软件Rope中文汉化蓝宝石版本全新UI界面,修复部分已知错误【附下载地址与详细使用教程】

rope蓝宝石版:点击下载 注意:此版本支持N卡、A卡、CPU,且建议使用中高端显卡,系统要求win10及以上。 Rope-蓝宝石 更新内容: 0214版更新: ①(已修复)恢复到以前的模型荷载参数。有…

GDPU 天码行空11

(一)实验目的 1、掌握JAVA中IO中各种类及其构造方法; 2、重点掌握IO中类所具有的IO操作方法; 3、熟悉软件中登录模块的开发方法; 4、掌握IO中读写常用方法。 5、进一步熟悉正则规则的使用方法。 (二&…

初期Linux

一,系统分为 1.1window系统 个人 :win7,win8,Win10,Win11服务器版:window server 2003,window server 2008 1.2Linux系统 centos7redhatubantukali 1.3什么是Linux? Linux是基…

强一致性的皇冠:分布式事务模型的至高法则揭秘

关注微信公众号 “程序员小胖” 每日技术干货,第一时间送达! 引言 分布式事务模型是分布式系统设计的核心,关键在于保证数据一致性和事务完整性,尤其强调强一致性。诸如2PC、3PC、Saga、TCC等模型与协议,应运而生以解…

Unity初级---初识生命周期

1. Awake() :唤醒函数,最先执行的函数,只执行一次,当脚本文件挂载的对象被激活时调用 2. OnEnable() ,OnDisable():当脚本启用和禁用时触发,可执行多次,触发的前提是脚本挂载的对象…

QT开发(四) 制作一个JSON检查小工具

1、JSON概念 1.1 定义 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人类阅读和编写,同时也易于机器解析和生成。JSON基于JavaScript语言的子集,但是独立于编程语言,因此可以被多种…

C语言----汉诺塔问题

1.什么是汉诺塔问题 简单来说,就是有三个柱子,分别为A柱,B柱,C柱。其中A柱从上往下存放着从小到大的圆盘,我们需要借助B柱和C柱,将A柱上的所有圆盘转移到C柱上,并且一次只能移动一个圆盘&#…

【Qt QML】Qt Quick Scene Graph

Qt Quick 2是一个用于创建图形界面的库,它使用一个专门的场景图(Scene Graph)来进行渲染。通过使用OpenGL ES、OpenGL、Vulkan、Metal或Direct 3D等图形API,Qt Quick 2可以有效地优化图形渲染过程。使用场景图而不是传统的命令式绘…

1688工厂货源API接口:用于商品采集、商品搜索、商品详情数据抓取

item_get 获得1688商品详情item_search 按关键字搜索商品item_search_img 按图搜索1688商品(拍立淘)item_search_suggest 获得搜索词推荐item_fee 获得商品快递费用seller_info 获得店铺详情item_search_shop 获得店铺的所有商品item_password 获得淘口令…

在拥有多个同名称密码的ap环境中,如何连接到指定信道或mac的ap路由器?

在给客户做ESP32-C3入墙开关项目时,客户问:在拥有多个同名称密码的ap环境中,如何连接到指定信道或mac的ap路由器?针对这个问题,启明云端工程师给出下面解决方法。 1、将wifi_sta_config_t配置中的channel配置为该信道…

神经网络怎么把隐含层变量融合到损失函数中?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

matplotlib和pandas与numpy

1.matplotlib介绍 一个2D绘图库; 2.Pandas介绍: Pandas一个分析结构化数据的工具; 3.NumPy 一个处理n纬数组的包; 4.实践:绘图matplotlip figure()生成一个图像实例 %matplotlib inline:图形直接在…

前端传递list(数组)类型参数,后端接收失败

一顿报错,我之前遇到的list都是Long类型 貌似用GET也是可以的,但是很奇怪一直报错 就是不可以 后来去百度 查询到可以用两种方法解决这个问题 1、拆开 传 以GET方式,后端GetMappingRequestParam接收。 2、以Post方式传,后端创建dto PostMappingReques…

elementUI table表格相同元素合并行----支持多列

效果图如下: vue2代码如下: 只粘贴了js方法哦, methods: {// 设置合并行 setrowspans() { const columns [‘name’, ‘value’]; // 需要合并的列名 // 为每个需要合并的列设置默认 rowspan this.tableData.forEach(row > { columns.forEach(col …

光电探测器性能指标测试

光电探测器的三个核心指标: 带宽,转换增益,噪声(信噪比,NEP,噪声密度) 测试环境:可调谐激光器(CW LASER),强度调制器(AM),信号发生器(AWG),可调衰…

【算法】滑动窗口——最大连续1的个数

本篇文章讲的是“最大连续1的个数”这道题,从最开始的简单暴力到用滑动窗口算法实现解题的思路历程,有需要借鉴即可。 目录 1.题目2.暴力求解3.滑动窗口解法3.1优化一:end重返start优化,end指针不回退3.2优化二:某一st…

Day_2

1. 菜品管理 新增菜品 接口设计 1. 根据类型查询分类(分类管理已完成) 查看接口文档即可 2. 文件上传 创建Bucket 采用的是阿里云的OSS对象存储服务 新增AccessKey 3. 菜品的新增逻辑 代码开发 1. 文件上传接口开发 为了提高代码的解耦性&#…