欢迎关注头条号:Java小野猫

注解属性方法

在进入了解 Spring 注解属性功能之前,我们先看一个正常 Java 注解。

在注解中,属性方法与其他类/接口方法写法类似,但是存在一些区别。

注解属性方法的返回类型仅限为八种基本类型(包装类不支持),字符串,class,enum,Annotation以及前面类型的数组。

复习一下,java 八种基本类型分别为,byte(字节型)、short(短整型)、int(整型)、long(长整型)、float(单精度浮点型)、double(双精度浮点型)、boolean(布尔型)、char(字符型)。

其次,注解属性方法可以使用 default设置默认值。如果没有设置默认值,声明注解时必须显式设置属性,否则编译将会出错。

另外 Java 注解无法继承类,也无法实现接口。

Spring 属性方法特性

在 Spring 中,有一些注解,使用不同属性方法,却能到达相同结果。典型的如 RequestMapping。

在 WEB 项目中,设置 url 路径,我们可以在方法是这样声明:

 @RequestMapping("hello") public String helloAnnotation() { 。。。。 }

上面方法本质使用注解 value 属性。当注解声明时只需要设置一个方法时,如果属性方法为 value,不需要使用 key=value 的语法,只需要直接设置属性值即可。

另外也可以使用 path 属性方法设置。

 @RequestMapping(path = "hello") public String helloAnnotation() { 。。。。 }

两种方式,最后运行效果一致。

查看 RequestMapping 注解源码,可以发现在 value 与 path 属性方法上使用 @AliasFor,并且两个互相指向对方。

Spring 4.2 加入 @AliasFor 注解,并使用 @AliasFor 重新更新 RequestMapping等注解,为它们内部带来了别名的功能。

@AliasFor 使用方式

在 Spring 中,@AliasFor 可以在同一注解中使用,使用方法如 RequestMapping 注解。

这种方式,带来含义明确属性方法。如 RequestMapping,path 属性方法,这个属性方法含义就比较明确,不同的人理解不会有偏差。而 value 属性含义就不是很明确,不能一下子就将它真正含义产生联系。

日常开发中,我们也要避免 i,a,b 这些无意义的命名,尽量使用含义明确的命名。这样利用维护代码的人理解。

第二点,同一注解属性方法相互别名,这样就兼容之前版本用法。

RequestMapping 注解如果仅新增 path 属性,然后根据其解析 url 路径,这样就会导致升级 Spring 版本过程,运行错误的。

一个好软件版本需要时向前兼容,如 JDK 8 兼容 JDK 6一样。

另外 @AliasFor 注解还可以作用与不同注解之前,典型的如 SpringBootApplication注解。

SpringBootApplication#scanBasePackages 别名与 ComponentScan#basePackages。设置前者间接为后者赋值。

Spring Boot 就是使用 @Aliasfor 与组合注解功能,使用 SpringBootApplication一个注解代替 Configuration,EnableAutoConfiguration,ComponentScan。

Spring 注解属性覆盖与别名

使用 @AliasFor 注解,可以做到别名的功能。

在 Spring 中别名可以分为以下几类:

  1. 显式别名(xplicit Aliases)
  2. 隐式别名(Implicit Aliases)
  3. 传递隐式别名(Transitive Implicit Aliases)

以上三类都需要满足以下条件:

  1. 属性类型相同
  2. 属性方法必须存在默认值
  3. 属性默认值必须相同

否则运行过程中将会出错。

显式别名

如果一个注解中的两个成员通过 @AliasFor声明后互为别名,那么它们是显式别名

显示别名的关系如图所示。

隐式别名

如果一个注解中的两个或者更多成员通过@AliasFor声明去覆盖同一个元注解的成员值,它们就是隐式别名

隐式别名如图所示。

上图中,@One 的 name 属性与 nameAlias 别名与 @Two nameAlias 属性。由于 @One 注解中并未直接使用 @AliasFor,所以与 @One 注解隐式别名。

隐式别名类似于数学的等式。可以将其看做以下推导过程。

@One.name=@Two.nameAlias@One.nameAlias=@Two.nameAlias可以推导出@One.name=@One.nameAlias

传递式隐式别名

如果一个注解中的两个或者更多成员通过@AliasFor声明去覆盖元注解中的不同成员,但是实际上因为覆盖的传递性导致最终覆盖的是元注解中的同一个成员,那么它们就是传递隐式别名。

传递式隐式别名如图所示。

这种类型涉及了多个注解,@One#name别名了 @Two#nameAlias属性,然后在 @One#nameAlias 属性又别名了 @Three#nameAliasThree 属性。然后由于 @Two#nameAlias又别名了 @Three#nameAliasThree 属性,这就导致 @One#name与 @One#nameAlias 间接才生了关系。这种依靠传递性才生别名关系,称为 传递式隐式别名。

隐式别名类似于数学的等式。大家也可以将其用上面等式推导。

属性覆盖

属性覆盖指的是注解的一个成员覆盖另一个成员,最后两者成员属性值一致。

属性覆盖可以分为三类:

  1. 隐式覆盖(Implicit Overrides)
  2. 显示覆盖(Explicit Overrides)
  3. 传递式显式覆盖(Transitive Explicit Overrides)

隐式覆盖

当一个注解 @One 被元注解 @Two 标注,两个注解存在同样的属性方法 name。@Two#name 将会被 @One#name 属性覆盖。

两个看似不来自不同注解的成员 name 指向了同一个成员 name。

显示覆盖

显示覆盖就比较简单了,使用 @AliasFor 注解之后,就成为显示覆盖。

传递式显式覆盖

如果注解 @One#name 显示覆盖了 @Two#nameAlias,而 @Two#nameAlias 显示覆盖了 @Three#nameAlias,最后因为传递性,@One#name 实际覆盖了@Three#nameAlias。

总结

Spring 4.2 新增 @AliasFor注解,带来一些特性。但是要注意的是仅仅存在 @AliasFor 不会执行任何语义别名。

底层原理可以参考 AnnotationUtils与 AnnotatedElementUtils。

欢迎做Java的朋友们私信我【资料】免费获取免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)

其中覆盖了互联网的方方面面,期间碰到各种产品各种场景下的各种问题,很值得大家借鉴和学习,扩展自己的技术广度和知识面。

requestmapping注解作用_Java高级架构师-Spring 注解编程之注解属性别名与覆盖相关推荐

  1. 轻量级锁_Java高级架构师-Java锁的升级策略 偏向锁 轻量级锁 重量级锁

    欢迎关注头条号:Java小野猫 这三种锁是指锁的状态,并且是专门针对Synchronized关键字.JDK 1.6 为了减少"重量级锁"的性能消耗,引入了"偏向锁&quo ...

  2. Java高级架构师之路核心知识整理

    小编整理出一篇Java高级架构师之路的核心知识,同时也是面试时面试官必问的知识点,篇章也是包括了很多知识点,其中包括了有基础知识.Java集合.JVM.多线程并发.spring原理.微服务.Netty ...

  3. 阿里P8高级架构师:面试没你想象中的难,拿Offer也可以很轻松

    阿里P8高级架构师:面试没你想象中的难,拿Offer也可以很轻松 一.概述 面试,难还是不难?取决于面试者的底蕴(技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想 ...

  4. 程序员职业发展路径图:从菜鸟工程师到高级架构师

    http://www.sohu.com/a/249729952_355140 踽踽独行上下求索总是痛苦,如果有良师益友陪伴点拨必能事半功倍.从新手码农到高级架构师,要经过几步?要多努力,才能成为为人倚 ...

  5. 高级架构师,精通JAVA/高并发/微服务/分布式/中间件

    JAVA高级架构师专栏 大纲介绍 Java基础复习 单点系统 Springboot框架应用 页面开发模版引擎 Java核心基础 JVM调优 高并发优化 Spring.Mybatis.Springboo ...

  6. 强推面试前必刷:Alibaba 内部 Java 高级架构师

    最近有很多同学已经开始准备下半年的跳槽面试了,不得不说还是要给这些同学竖一个大拇指的,看来这些同学都是未雨绸缪的行家呀!老师今天就为大家分享一份 Alibaba 内部 Java 高级架构师面试题的总结 ...

  7. 高级架构师_Redis_第1章_缓存原理与设计

    高级架构师_Redis_第1章_ 缓存原理与设计 文章目录 高级架构师_Redis_第1章_ 缓存原理与设计 第一节 缓存原理与设计 1.1 缓存基本思想 1.11 缓存的使用场景 1.12 什么是缓 ...

  8. 【架构师教程】廖雪峰大牛的Java高级架构师教程

    可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地. 成为Java架构师,需要掌握哪些技能呢 ...

  9. 成为Java高级架构师必看的15本书

    成为Java高级架构师必看的15本书 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐 ...

最新文章

  1. JavaScript正则表达式笔记
  2. RCF的优势--分布式应用
  3. emoji表情过滤处理
  4. linux命令封装sh,shell脚本学习之调用脚本将文件打包zip的方法示例
  5. 计算机高速接口与嵌入式设计与实现,基于嵌入式双结构通信系统高速接口的设计与实现...
  6. 一文详解3D相机面临的困难问题和解决方案
  7. dell笔记本外接显示器_小桌面 笔记本外接显示器的正确姿势
  8. 计算机科学导论第五版第二章答案,计算机科学导论第2章-答案
  9. 华尔街持续唱多美股市场,微美全息发布VR设备领涨科技股
  10. python投资组合有效边界,【python量化】如何用Python找到投资时的最佳组合比例
  11. 曝光三要素:光圈、快门、ISO
  12. Centos打开3306端口
  13. 图像处理公共数据库下载地址集锦
  14. delphi创建excel写入数据并创建二维折线图
  15. 思维导图 XMind 闯关之路(第01关)新建文件 建立分支
  16. 1024程序员节来了,
  17. 三阶魔方六面拼齐教程
  18. 喝酒游戏,概率分布和卷积
  19. 《如何高效学习》:将所学的知识运用到实际中去
  20. matlab中diag什么,线性代数里的“diag”是什么意思?

热门文章

  1. swift:自定义UICollectionViewFlowLayout
  2. 史上最权威的 Activiti 框架学习
  3. [转]学习object-c,补习一下指针
  4. 安装mysql 遇到最后一步卡死解决方案
  5. 【原】聊聊js代码异常监控
  6. 机器学习-python的工作目录
  7. 最强战队实力交锋,算法“视”界杯终极一战即将上演
  8. 从实操教学到赛题演练,腾讯专家亲授TI-ONE平台操作攻略!
  9. 【王牌选手分享】一发问鼎!鹅厂大神上分思路,助你玩转初赛!
  10. 建站+流量+运营,跨境电商的2021