Sring 的 @AliasFor 使用规则
一、该标签存在的意义
顾名思义 @AliasFor 表示别名,它可以注解到自定义注解的两个属性上,表示这两个互为别名,也就是说这两个属性其实同一个含义。该标签存在的含义,从网上查发现有个点,
- 若 自定义注解有一个属性,且该属性命名上为了体现其含义,所以有些复杂,这样调用方必须每次使用自定义注解的时候,都必须写明 属性 ,然后设置,这样会比较负责;
- 同时若自定义注解继承了另一个注解,要想让调用方能够设置继承过来的属性值,就必须在自定义注解中重新定义一个属性,同时声明该属性是父注解某个属性的别名。
二、该标签的用法
/**
* @AliasFor 用法:<br>
* <li>用到注解 属性上,表示两个属性互相为别名,互相为别名的属性值必须相同,若设置成不同,则会报错</li>
* <li>注解是可以继承的,但是注解是不能继承父注解的属性的,也就是说,我在类扫描的时候,拿到的注解的属性值,依然是父注解的属性值,而不是你定义的注解的属性值<br>
* 所以此时可以在子注解对应的属性上加上@AliasFor<br>
* <pre><code>
*
* </code></pre>
* </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 = AnnotationUtils.getAnnotation(this.getClass(), 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 = AnnotationUtils.getAnnotation(this.getClass(), 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 = AnnotationUtils.getAnnotation(this.getClass(), 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 = AnnotationUtils.getAnnotation(this.getClass(), SubMyAnnotation.class);
System.out.println("value:" + myAnnotation.value() + ";loation:" + myAnnotation.subLocation());
}
}
(2) 不设置 SubMyAnnotation 中 value 默认值设置为 ddd,则如上的例子可以成功执行
Sring 的 @AliasFor 使用规则的更多相关文章
- 【Spring注解驱动开发】组件注册-@ComponentScan-自动扫描组件&指定扫描规则
写在前面 在实际项目中,我们更多的是使用Spring的包扫描功能对项目中的包进行扫描,凡是在指定的包或子包中的类上标注了@Repository.@Service.@Controller.@Compon ...
- Yii1.1的验证规则
在Yii1.1的数据验证是由CValidator完成,在CValidator中提供了各种基本的验证规则 <?php public static $builtInValidators=array( ...
- iOS之应用版本号的设置规则
版本号的格式:v<主版本号>.<副版本号>.<发布号> 版本号的初始值:v1.0.0 管理规则: 主版本号(Major version) 1. 产品的主体构件进 ...
- ThinkPhp5.0模型验证规则
Tp5提供了模型数据规则的验证功能,用于在数据save或者update前验证数据的有效性.Tp5提供校验规则的类为\Think\Validate,默认提供的校验规则可以查看该文件. 在Model文件中 ...
- PHP 面向对象编程和设计模式 (5/5) - PHP 命名空间的使用及名称解析规则
PHP高级程序设计 学习笔记 2014.06.12 命名空间概述 PHP 在 5.3.0 以后的版本开始支持命名空间.什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这 ...
- "Chinese_PRC_CI_AS" 和 "Chinese_PRC_90_CI_AI" 之间的排序规则冲突问题
这个错误真是太恶心了.不过有解决办法,你问我哪来的?当然百度的咯! 示例: select a.workTypeDes from A a,B b where a.workTypeCode=b.work ...
- mysql大小写敏感与校对规则
大家在使用mysql过程中,可能会遇到类似一下的问题: root@chuck 07:42:00>select * from test where c1 like 'ab%'; +-----+ ...
- Java 特定规则排序-LeetCode 179 Largest Number
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- Scala化规则引擎
1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...
随机推荐
- 【JVM】01虚拟机内存模型
学习链接:https://blog.csdn.net/u010425776/article/details/51170118 博主整理的条理清晰,在这里先感谢博主分享 去年看视频学习写过一篇JVM的博 ...
- Google Chrome浏览器插件入门开发
--1. 在html文件中引用js 文件 --2.在Google Chrome中开发简单插件 1.首先,简单说明一下在html 中引用js 文件: 将kittenbook.html 和 kittenb ...
- PATA 1009. Product of Polynomials (25)
1009. Product of Polynomials (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...
- C++ luogu1352没有上司的舞会 from_树形DP
luogu1352没有上司的舞会 分析(树形DP模板题): 没学树形DP的,看一下. 把该题抽象到一颗树中,设i的下属就是他的儿子,则有两种情况: 如果i参加,他的儿子就不能参加. 如果i不参加,他的 ...
- 并发编程-Future+callable+FutureTask 闭锁机制
项目中经常有些任务需要异步(提交到线程池中)去执行,而主线程往往需要知道异步执行产生的结果,这时我们要怎么做呢?用runnable是无法实现的,我们需要用callable实现. FutureTask ...
- C语言学习书籍推荐《C专家编程Expert C Programming Deep C Secrets》下载
Peter Van Der Linden (作者) <C和C++经典著作 C专家编程Expert C Programming Deep C Secrets>展示了C程序员所使用的编码技巧, ...
- Java学习笔记之---方法和数组
Java学习笔记之---方法与数组 (一)方法 (1)什么是方法? 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 (2)方法的优点 使程序变得更简短而 ...
- wcf服务编程(二)
地址: 1.命名管道:用于同一台机器的跨进程通讯.URL表示方式为:net.pipe:// ;由于是在同一台机器的不同进程间通讯,所以不用定义端口号.
- mplayer+ffmpeg 组合截图
mplayer截图的优点:对于一个时长很长的视频,可以任意指定一个时间点截图,mplayer会直接跳到这个时间点开始解码截图: 缺点:由于是直接跳到指定的时间点,也就是直接跳过了之前的帧,这样解码出来 ...
- blast2go本地化 mysql_study
mysql yum -y install mysql mysqladmin -uroot -passwd "oebiotech" mysql -uroot -poebiotech ...