@AliasFor 使用
@AliasFor 它允许开发者为一个注解的属性指定别名。通过使用@AliasFor,我们可以提供多个名称来引用同一属性,从而增加了代码的灵活性和可读性
定义一个注解
package com.example.demo.aspect;import org.springframework.core.annotation.AliasFor;import java.lang.annotation.*;/*** 蔡定努* 2024/06/06 13:25*/
@Documented
@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CR {@AliasFor("name")String key() default "";@AliasFor("key")String name() default "";}
使用
@PostMapping("two")@CR(name = "可看出")public void two(@RequestBody Product product) {System.out.println(0);}
定义一个切面
package com.example.demo.aspect;import cn.hutool.core.annotation.AnnotationUtil;
import com.cdn.cretry.anno.CRetry;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;import java.lang.reflect.Method;/*** @author 蔡定努* 2024/06/01 23:21*/
@Component
@Aspect
@Slf4j
public class CRetryAspect {@Before(value = "@annotation(c)")public void checkCRAnnotation(JoinPoint joinPoint, CR c) throws Throwable {MethodSignature ms = (MethodSignature) joinPoint.getSignature();Method method = ms.getMethod();CR cRetry = method.getAnnotation(CR.class);System.out.println("这是method.getAnnotation输出的值"+cRetry);CR annotation = AnnotationUtils.getAnnotation(method, CR.class);System.out.println("这是AnnotationUtils输出的值"+annotation);}
}
输出:
这是method.getAnnotation输出的值@com.example.demo.aspect.CR(name=可看出, key=)
这是AnnotationUtils输出的值@com.example.demo.aspect.CR(key=可看出, name=可看出)
理论上来说,注解的key和name,都有彼此的别名,设置了一个值之后,另一个值也绑定该值,实际上需要使用AnnotationUtils才行,原因是该属性值的赋予是经过AnnotationUtils中的getAnnotation方法实现的