您的位置:首页 > 财经 > 产业 > Spring @AliasFor用法

Spring @AliasFor用法

2024/10/6 14:23:23 来源:https://blog.csdn.net/luo15242208310/article/details/139648624  浏览:    关键词:Spring @AliasFor用法

同注解内属性互为alias

  • @AliasFor的两端必须对称使用,如下name和value互为alias
  • 且两端的类型、默认值必须相同,
  • 在实际使用时仅赋值一个属性即可,若同时设置多个属性则要求值必须都相同
  • 通过Spring AnnotationUtils工具解析注解支持@AliasFor,直接使用Java Reflect机制不支持@AliasFor
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {//注:@AliasFor的两端必须对称使用,如下name和value互为alias//且两端的类型、默认值必须相同,//在实际使用时仅赋值一个属性即可,若同时设置多个属性则要求值必须都相同@AliasFor("value")String name() default "biz";@AliasFor("name")String value() default "biz";
}

如下为AOP 切面内解析注解的示例,原生Java反射不支持解析@AliasFor,需要通过Spring工具类AnnotationUtils进行支持:

@Aspect
@Component
public class MyAnnoAspect {@Pointcut("@annotation(com.luo.MyAnno)")public void myAnnoCut() {}@Before("myAnnoCut()")public Object before(ProceedingJoinPoint joinPoint) throws Throwable {MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();//不支持:直接使用Java Reflect机制不支持@AliasForMyAnno myAnno1 = methodSignature.getMethod().getAnnotation(MyAnno.class)//支持:通过Spring AnnotationUtils工具解析注解支持@AliasFor//即name和value值相同MyAnno myAnno2 = AnnotationUtils.getAnnotation(methodSignature.getMethod(), MyAnno.class);}//...
}

覆盖元注解属性

  • 当前注解需在定义处引用元注解
  • 当前注解属性作为元注解的属性的别名,标注了当前注解即相当于同时亦标注了元注解
  • 当前注解属性的默认值可以和元注解属性的默认值不同
  • AnnotationUtils.getAnnotation支持解析元注解,但是不支持@AliasFor
  • AnnotatedElementUtils.getMergedAnnotation支持解析元注解,并且支持@AliasFor
//当前注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@MyMetaAnno //引用元注解
public @interface MyAnno {@AliasFor("value")String name() default "biz";@AliasFor("name")String value() default "biz";//当前注解内属性作为元注解属性的别名,即当前属性值会自动赋值到元注解相应属性中//注:当前注解属性的默认值可以和元注解属性的默认值不同@AliasFor(attribute = "keyAttr", annotation = MyMetaAnno.class)String keyAttr() default "myBizid";
}//此为元注解(可作用于其他注解定义上)
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyMetaAnno {  String keyAttr() default "id";
}

如下为AOP 切面内解析注解的示例,AnnotationUtils.getAnnotation支持解析元注解,但是不支持@AliasFor,需通过AnnotatedElementUtils.getMergedAnnotation支持解析元注解且支持@AliasFor:

@Aspect
@Component
public class MyAnnoAspect {@Pointcut("@annotation(com.luo.MyAnno)")public void myAnnoCut() {}@Before("myAnnoCut()")public Object before(ProceedingJoinPoint joinPoint) throws Throwable {MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();//通过Spring AnnotationUtils工具解析注解支持@AliasFor,//支持同注解内属性互为alias,即name和value值相同MyAnno myAnno = AnnotationUtils.getAnnotation(methodSignature.getMethod(), MyAnno.class);//通过Spring AnnotatedElementUtils工具解析元注解,//支持元注解@AliasFor属性,即MyAnno.keyAttr会自动赋值给MyMetaAnno.keyAttr,//仅在切点方法上标注了MyAnno注解,但可以通过AnnotatedElementUtils解析MyAnno的关联的元注解MyMetaAnno,并支持属性的覆盖MyMetaAnno myMetaAnno = AnnotatedElementUtils.getMergedAnnotation(methodSignature.getMethod(), MyMetaAnno.class);}//...
}

参考:
https://www.cnblogs.com/ken-jl/p/9705502.html
https://www.baeldung.com/spring-aliasfor-annotation

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com