认识Spring的注解(三)之@AliasFor使⽤规则
⼀、该标签存在的意义
顾名思义 @AliasFor 表⽰别名,它可以注解到⾃定义注解的两个属性上,表⽰这两个互为别名,也就是说这两个属性其实同⼀个含义。该标签存在的含义,从⽹上查发现有个点,
若⾃定义注解有⼀个属性,且该属性命名上为了体现其含义,所以有些复杂,这样调⽤⽅必须每次使⽤⾃定义注解的时候,都必须写明属性,然后设置,这样会⽐较负责;
同时若⾃定义注解继承了另⼀个注解,要想让调⽤⽅能够设置继承过来的属性值,就必须在⾃定义注解中重新定义⼀个属性,同时声明该属性是⽗注解某个属性的别名。
⼆、该标签的⽤法
/**
* @AliasFor ⽤法:<br>
* <li>⽤到注解属性上,表⽰两个属性互相为别名,互相为别名的属性值必须相同,若设置成不同,则会报错</li>
* <li>注解是可以继承的,但是注解是不能继承⽗注解的属性的,也就是说,我在类扫描的时候,拿到的注解的属性值,依然是⽗注解的属性值,⽽不是你定义的注解的属性值<br> * 所以此时可以在⼦注解对应的属性上加上@AliasFor<br>
* <pre><code>
*
* </code></pre>
spring framework表达式assign* </li>
* @author sandy
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Inherited
public @interface MyAnnotation {
@AliasFor(attribute = "location")
String value() default "";
@AliasFor(attribute = "value")
String location() default "";
}
1、同个注解中的两个属性互为别名
在 MyAnnitation ⾃定义注解类中,value属性和location属性互为别名,此时⽤的时候可以指定属性名设置属性值,也可以缺省属性名:(1) 指定属性名设置属性值
@MyAnnotation(location = "location")
public class AliasTest extends BaseTest {
@Test
public void test() {
MyAnnotation myAnnotation = Class(), MyAnnotation.class);
System.out.println("value:" + myAnnotation.value() + ";loation:" + myAnnotation.location());
}
}
输出值为:
value:location;loation:location
@MyAnnotation(value = "location")
public class AliasTest extends BaseTest {
@Test
public void test() {
MyAnnotation myAnnotation = Class(), MyAnnotation.class);
System.out.println("value:" + myAnnotation.value() + ";loation:" + myAnnotation.location());
}
}
输出值为:
value:location;loation:location
由上可知,⽆论指明设置哪个属性名设置属性值,另⼀个属性名也是同样属性值。若两个都指明属性值,要求值必须相同,否则会报错。(2) 缺省属性名设置属性值
@MyAnnotation("location")
public class AliasTest extends BaseTest {
@Test
public void test() {
MyAnnotation myAnnotation = Class(), MyAnnotation.class);
System.out.println("value:" + myAnnotation.value() + ";loation:" + myAnnotation.location());
}
}
输出值:
value:location;loation:location
2、继承⽗注解的属性,使其拥有更强⼤的功能
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Inherited
@MyAnnotation
public @interface SubMyAnnotation {
@AliasFor(value="location",annotation=MyAnnotation.class)
String subLocation() default "";
@AliasFor(annotation=MyAnnotation.class) //缺省指明继承的⽗注解的中的属性名称,则默认继承⽗注解中同名的属性名 String value() default "";
}
在 SubMyAnnotation 中明显 subLocation 和 value 是互为别名。
(1) 将 SubMyAnnotation 中 value 默认值设置为 ddd,此时,使⽤注解时作如下配置会报错
@SubMyAnnotation(subLocation = "location")
public class SubAliasTest extends BaseTest {
@Test
public void test() {
SubMyAnnotation myAnnotation = Class(), SubMyAnnotation.class);
System.out.println("value:" + myAnnotation.value() + ";loation:" + myAnnotation.subLocation());
}
}
(2) 不设置 SubMyAnnotation 中 value 默认值设置为 ddd,则如上的例⼦可以成功执⾏
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论