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. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...
随机推荐
- 【Idea】JUnit单元测试%MODULE_WORKING_DIR%' does not exist
Idea执行单元测试时报错:上午9:35 Error running 'MobileMessageImplTest.java': Cannot start process, the working d ...
- 【过时】update progress has encountered a problem解决办法
笔者第二次整理博客,已经抛弃MyEclipse了,我将公司项目转换成了idea的目录结构后大家都改换Idea进行开发,虽然我个人比较喜欢eclipse的简洁干净,但是Idea的确有很多方便开发的新功能 ...
- yii中find()指定条件
find()查找指定的条件 $modelName::model->find(); 使用条件对象 $criteria = new CDbCriteria(); $criteria->sele ...
- django基础知识之QueryDict对象:
QueryDict对象 定义在django.http.QueryDict request对象的属性GET.POST都是QueryDict类型的对象 与python字典不同,QueryDict类型的对象 ...
- Redis中的Stream数据类型作为消息队列的尝试
Redis的List数据类型作为消息队列,已经比较合适了,但存在一些不足,比如只能独立消费,订阅发布又无法支持数据的持久化,相对前两者,Redis Stream作为消息队列的使用更为有优势. 相信 ...
- Oracle数据库常用脚本命令(二)
--创建学生信息表create table student( sid number(8,0), name varchar2(20), sex char(2), birthday date, addre ...
- java中动态代理的使用
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代 ...
- 堡垒机-jumpserver
目录 官方网站 Jumpserver 软件包环境要求: 环境 手动本地jumpserver-服务端搭建 初始化一些系统环境设置: 安装相关软件 安装 组件 自建服务器极速安装步骤 0. 防火墙.Sel ...
- 你懂什么叫js继承吗
说到继承呢?肯定有很多做java的朋友都觉得是一个比较简单的东西了.毕竟面向对象的三大特征就是:封装.继承和多态嘛.但是真正对于一个javascript开发人员来说,很多时候其实你使用了继承,但其实你 ...
- [转载] 管Q某犇借的手写堆
跟gxy大神还有yzh大神学了学手写的堆,应该比stl的优先队列快很多. 其实就是维护了一个二叉堆,写进结构体里,就没啥了... 据说达哥去年NOIP靠这个暴力多骗了分 合并果子... templat ...