aop实现自定义注解

news/2025/2/16 5:09:55/

注解简单知识

关键字

自定义注解的关键字是@interface

参数类型

自定义注解的参数类型:八大基础类型、String、枚举、注解,还可以是以上类型对应的数组

如果只有一个成员变量,名字叫value

注解赋值

如果定义了成员变量,必须要给成员变量赋值 @MyAnnotation(value="")

如果只有一个成员变量,且成员变量的名称是value,可以省略value@MyAnnotation("")

如果成员变量给定默认值,可以不用再次赋值

一个注解的内部可以不定义成员变量的(@override)

定义了成员变量的注解叫元数据

没有定义成员变量的注解叫标记

元注解

用于修饰其他注解的注解

@Retention

值是一个枚举类型

 用于声明生命周期

SOURCE:生命周期只在源文件中,编译器直接丢弃这种策略的注释,在.class文件中不会保留注解信息

CLASS:在字节码文件中有效,默认

RUNTIME:运行时有效,当运行Java程序时,JVM会保留注释,加载在内存中,程序可以通过反射获取该注释

@TARGET

用于指定被修饰的注解能用于修饰哪些程序元素

包含一个value的成员变量

 值

public enum ElementType {/** Class, interface (including annotation type), or enum declaration */TYPE,/** Field declaration (includes enum constants) */FIELD,/** Method declaration */METHOD,/** Formal parameter declaration */PARAMETER,/** Constructor declaration */CONSTRUCTOR,/** Local variable declaration */LOCAL_VARIABLE,/** Annotation type declaration */ANNOTATION_TYPE,/** Package declaration */PACKAGE,/*** Type parameter declaration** @since 1.8*/TYPE_PARAMETER,/*** Use of a type** @since 1.8*/TYPE_USE
}

@Document

用于指定被该元注解修饰的注解类将被javadoc工具提取成文档。默认情况下,javadoc时不包括注解的,但是加上了这个注解生成的文档中就带着注解了

Document注解修饰了Deprecated注解,那么 Deprecated注解就会在javadoc提取的时候,提取到API中

@Inherited

被它修饰的注解具有继承性,如果有个类使用了被@Inherited修饰的注解,那么它的子类也将具有该注解

aop实现自定义注解

添加依赖

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

写需要的注解

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation {/** 请求类型 */String reqType();/** 接口类型 */String apiType();
}

定义切面

@Aspect
@Component
public class LogAspect {@Around("@annotation(logAnnotation)")public Object around(ProceedingJoinPoint point, LogAnnotation logAnnotation) throws Throwable{// 类名String className = point.getTarget().getClass().getName();// 方法名String methodName = point.getSignature().getName();// 开始时间long startTime = System.currentTimeMillis();// 执行方法  proceed就是返回值Object proceed = point.proceed();// 结束时间long endTime = System.currentTimeMillis();// 获取入参String args = JSON.toJSONString(point.getArgs()[0]);// 获取注解中apiType的值String apiType = logAnnotation.apiType();System.out.println("类名:" + className + ";方法名:" + methodName + ";开始时间:" + startTime + ";结束时间:" + endTime);System.out.println("入参:" + args + ";返回值:" + proceed + ";注解参数apiType:"+ apiType);// 获取签名Signature signature = point.getSignature();if(signature instanceof MethodSignature){MethodSignature methodSignature = (MethodSignature) signature;// 参数名称String[] properties = methodSignature.getParameterNames();System.out.println("参数名称:" + Arrays.toString(properties));// 返回类型Class<?> methodReturnType = methodSignature.getReturnType();System.out.println("返回类型:" + methodReturnType);}return proceed;}}

测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class TestAnnotation {@AutowiredServiceImpl service;@Testpublic void test(){service.jieshao("zhangsan",19);}
}class Student{public Student(String name, Integer age){this.name = name;this.age = age;}String name;Integer age;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}@Service
class ServiceImpl{@LogAnnotation(reqType = "请求类型", apiType = "api类型")public Student jieshao(String name, Integer age){Student student = new Student(name, age);return  student;}
}


http://www.ppmy.cn/news/83739.html

相关文章

第十三章 常用类(Math 类、Arrays 类、System类、Biglnteger 和BigDecimal 类、日期类)

一、Math 类&#xff08;P481&#xff09; Math类包含&#xff0c;用于执行基本数学运算的方法&#xff0c;如初等指数、对数、平方根和三角函数 &#xff08;1&#xff09;abs&#xff1a;绝对值 &#xff08;2&#xff09;pow&#xff1a;求幂 double pow Math.pow(2, 4); /…

PCIE总线基本介绍(和PCI总线差异、速率计算、引脚定义)

1、PCI和PCIE的差异 (1)PCIE协议在软件编程上是兼容PCI协议&#xff0c;不同在于PCIE和PCI的控制器&#xff1b; (2)PCIE是差分串行信号线&#xff0c;PCI是电平并行信号线&#xff1b; (3)PCI协议使用INTA#、INTB#、INTC#、INTD#四根中断线来触发终端&#xff0c;PCIE协议没有…

如何查看一个 docker 镜像有哪些版本

如何查看一个 docker 镜像有哪些版本 因为通过 docker search 并不能查看某个镜像的版本信息&#xff0c;如我需要特定版本的 redis 那怎么办呢~ 本文提供了如下几种方式&#xff0c;大家可以分别逐个尝试下~ 为什么有几种方式呢&#xff0c;因为官方的查找镜像网址 Docker H…

如何把数据从 TDengine 2.x 迁移到 3.x ?

一.迁移背景&#xff1a; 随着时序数据库&#xff08;Time Series Database&#xff09; TDengine 3.0 的发布至今&#xff0c;我们除了在持续地优化产品质量的本身&#xff0c;也一直在努力地提升用户体验。但由于 3.0 底层有大量的重构优化&#xff0c;导致开源版的 2.0 用户…

如何在Spring Boot服务端实现公网远程调试并进行HTTP服务监听

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

什么是SQL Server 审核

IT 安全专业人员需要定期监视和审核 SQL Server 中的所有活动&#xff0c;以确保关键数据的完整性和机密性不会受到损害。手动监视服务器上的所有这些活动是一个忙碌的过程。为了使管理员的工作更轻松一些&#xff0c;Microsoft 提供了 SQL Server 审核功能来帮助管理员有效地审…

第四十二天学习记录:C语言进阶:笔试题整理Ⅲ

问&#xff1a;解释一下int(*a[20])(int)是什么&#xff1f; ChatAI答&#xff1a; int (*a[20])(int) 是一个数组&#xff0c;该数组中每个元素都是一个指向函数的指针&#xff0c;该函数具有一个int类型的参数&#xff0c;并返回一个int类型的值。 具体来说&#xff0c;a是一…

你不知道的useEffect

相信大家在写react时&#xff0c;在项目中使用了大量的useEffect&#xff0c;以至于让我们的代码变得混乱和难以维护。 难道说useEffect这个hook不好吗&#xff1f;并不是这样的&#xff0c;只是我们一直在滥用而已 在这篇文章中&#xff0c;我将展示怎样使用其他方法来代替us…