定义注解是使用@interface声明一个注解
public @interface MyTest {
}
@Target({ElementType.TYPE}) 注解:
指定注解的合法使用范围,ElementType 这个枚举类型的常量提供了一个简单的分类
public enum ElementType {
/** 类, 接口 (包括注解类型), 或 枚举 声明 */
TYPE,
/** 字段声明(包括枚举常量) */
FIELD,
/** 方法声明(Method declaration) */
METHOD,
/** 正式的参数声明 */
PARAMETER,
/** 构造函数声明 */
CONSTRUCTOR,
/** 局部变量声明 */
LOCAL_VARIABLE,
/** 注解类型声明 */
ANNOTATION_TYPE,
/** 包声明 */
PACKAGE,
/**
* 类型参数声明
* @since 1.8
*/
TYPE_PARAMETER,
/**
* 使用的类型
* @since 1.8
*/
TYPE_USE
}
@Retention({RetentionPolicy.Runtime}) 注解:
RetentionPolicy这个枚举类型的常量描述保留注解的各种策略,它们与元注解(@Retention)一起指定注释要保留多长时间
public enum RetentionPolicy {
/**
* 注解只在源代码级别保留,编译时被忽略
*/
SOURCE,
/**
* 注解将被编译器在类文件中记录
* 但在运行时不需要JVM保留。这是默认的
* 行为.
*/
CLASS,
/**
*注解将被编译器记录在类文件中
*在运行时保留VM,因此可以反读。
* @see java.lang.reflect.AnnotatedElement
*/
RUNTIME
}
@Documented注解
Documented注解表明这个注解是由 javadoc记录的,在默认情况下也有类似的记录工具。 如果一个类型声明被注解了文档化,它的注解成为公共API的一部分。
添加maven依赖,引入AOP依赖
org.springframework.boot
spring-boot-starter-aop
定义注解
/**
* 参数校验注解(非空校验)
*/
@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ParamCheck {
// 名称
String value() default "";
// 非空参数列表
String[] notNull() default "";
}
添加切面
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class ParamAspect {
@Pointcut("@annotation(com.xiaofeixia.annotation.ParamCheck)")
private void check(){
System.out.println("这是切面定义");
}
// 对于使用注解的地方执行前置处理
@Before("@annotation(ParamCheck)")
public void before(){
System.out.println("前置事件被调用了");
}
// 配置切点及获取注解返回值
@Around("check() && @annotation(paramCheck)")
public Object checkParam(ProceedingJoinPoint joinPoint, ParamCheck paramCheck) throws Throwable {
// 获取方法签名
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
// 获取参数类型
Class[] parameterTypes = methodSignature.getParameterTypes();
// 获取参数名称
String[] parameterNames = methodSignature.getParameterNames();
// 获取参数值
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
if(arg == null || arg.equals("")){
return "非法参数";
}
}
System.out.println(parameterNames[0]);
System.out.println(paramCheck.notNull()[0]);
return joinPoint.proceed();
}
}
调用注解
@ParamCheck(notNull = "id")
@PostMapping("detail")
@ResponseBody
public String detail(Integer id){
return userService.selectById(id).toString();
}
以上就是Spring Boot实现自定义注解的过程,自定义注解的过程使用了Spring AOP进行拦截并做相应的处理
Spring AOP原理及使用可以参考:https://blog.csdn.net/m0_37798046/article/details/115196752
本文主要介绍了自定义注解及Spring Boot实现自定义注解的方法,希望对大家有帮助~~