在spring中,最常见的一个注解AliasFor
它的作用就是多个属性互为别名
package org.springframework.core.annotation; import java.lang.annotation.Annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) @Documented public @interface AliasFor { @AliasFor("attribute") String value() default ""; @AliasFor("value") String attribute() default ""; Class<? extends Annotation> annotation() default Annotation.class; }
就是说attribute和value的值是一样的,互为别名
为什么需要互为别名呢?
原因是当使用注解时,注解有value()属性,不指明具体名称时就默认是value
我们常见的就是springMVC里面的@RequestMapping
一般用@RequestMapping("xxx")
这里默认就是@RequestMapping(value = "xxx")
看RequestMapping源码,看到value和path是互为别名,如果不是互为别名,那么就要这样写@RequestMapping(path = "xxx")。就会显得很麻烦
package org.springframework.web.bind.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.core.annotation.AliasFor; @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface RequestMapping { String name() default ""; @AliasFor("path") String[] value() default {}; @AliasFor("value") String[] path() default {}; RequestMethod[] method() default {}; String[] params() default {}; String[] headers() default {}; String[] consumes() default {}; String[] produces() default {}; }
这里说明value()并不是注解必须属性,互为别名一般不用两个都赋值,如果两个一起赋值,必须一样不然报错。互为别名一定要设置默认值,而却默认值一定相同
参考文章:javascript:void(0)
https://zhidao.baidu.com/question/651652368964470565.html
属性annotation(),指定属性是继承某注解
当不用此属性时,自定义一个注解,两个属性互为别名,是这样表示。annotation缺省指明继承的父注解的中的属性名称,则默认继承父注解中同名的属性名
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration @interface MyBean { @AliasFor("value") String beanName() default ""; @AliasFor("beanName") String value() default ""; }
当使用此属性时,也可以这样互为别名
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration @interface MyBean { @AliasFor(value = "value", annotation = Configuration.class) String beanName() default ""; @AliasFor(annotation = Configuration.class) String value() default ""; }
看Configuration源码
package org.springframework.context.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.core.annotation.AliasFor; import org.springframework.stereotype.Component; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Configuration { @AliasFor( annotation = Component.class ) String value() default ""; }