谈谈方法
@AliasFor注解详细说明
@AliasFor注解详细说明
@AliasFor是Spring框架的⼀个注解,⽤于声明注解属性的别名。它有两种不同的应⽤场景。
注解内的别名
元数据的别名
两者主要的区别在于是否在同⼀个注解内。
1.注解内的别名
我们先来看⼀下@AliasFor的源码
@Retention(RetentionPolicy.RUNTIME)
良好的行为习惯@Target(ElementType.METHOD)
日本关西@Documented
public @interface AliasFor {
/**
* Alias for {@link #attribute}.
* <p>Intended to be ud instead of {@link #attribute} when {@link #annotation}
* is not declared — for example: {@code @AliasFor("value")} instead of
* {@code @AliasFor(attribute = "value")}.
*/
@AliasFor("attribute")
String value()default"";
/**
* The name of the attribute that <em>this</em> attribute is an alias for.
* @e #value
*/
@AliasFor("value")
String attribute()default"";
/**
风景照* The type of annotation in which the aliad {@link #attribute} is declared.
* <p>Defaults to {@link Annotation}, implying that the aliad attribute is
* declared in the same annotation as <em>this</em> attribute.
*/
Class<?extends Annotation>annotation()default Annotation.class;
}
它的源码本⾝就⽤到了注解内别名这⼀特性,就是我们说的第⼀个场景。通过源码很容易知道,当我们使⽤这个注解
时,@AliasFor(value=“xxx”)和@AliasFor(attribute=“xxx”)是等价的。
这么说可能有些懵,还是举个例⼦吧。
假设现在有⼀个注解@MyAnnotationA
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface MyAnnotationA {
String a1()default"";
}
⽤这个注解时我们可以像这样@MyAnnotationA(a1=“xxx”),表⽰a1的属性传⼊了xxx的值。
假设现在我想换⼀种⽅式⽤这个注解,我打算⽤这样的@MyAnnotationA(a2=“xxx”)实现同样的效果,这时就可以通过别名的⽅式实现。我们修改@MyAnnotationA仔猪副伤寒
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface MyAnnotationA {
终极特工@AliasFor("a2")
String a1()default"";
@AliasFor("a1")
String a2()default"";
}
这种⽤法有⼏点注意事项:
1. 组成别名对的每个属性都必须加上注释 @AliasFor,attribute()或value() 属性必须引⽤该对中另⼀个属性
2. 别名属性必须声明相同的返回类型
3. 别名属性必须声明⼀个默认值
4. 别名属性必须声明相同的默认值
2.元数据的别名
直接上例⼦
在创建⼀个@MyAnnotationB注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@MyAnnotationA
public @interface MyAnnotationB {
@AliasFor(annotation = MyAnnotationA.class,value ="a2")
String value()default"";
}
这时@MyAnnotationB(“vvv”)就和@MyAnnotationA(a2=“vvv”)等价。
这⾥可以理解成,注解MyAnnotationB的value属性重写了注解MyAnnotationA的a2属性,但重新的属性的返回类型必须相同。其实SpringBoot这种⽤法很多,随便来看⼀对,就看最常见的@Component和@Configuration
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
榜样意思public @interface Configuration {
@AliasFor(annotation = Component.class)
String value()default"";
boolean proxyBeanMethods()default true;
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
如何追水瓶女String value()default"";
}
可以看出对于value这个属性来说,@Configuration注解中的值会重写@Component的value属性值,这有点像类之间的继承,⼦类可以重⽗类的⽅法。我们也可以将@Configuration注解看成@Component的⽗注解。