@AliasFor注解

@AliasFor是一个注解,用于为注解属性声明别名。

代码如下:它有两个属性value和attribute @AliasFor注解注释了

自身,并且value和attribute互为别名



把多个元注解的属性组合在一起形成新的注解

如我们熟知的@SpringBootApplication :



如上所示@SpringBootApplication并没有定义新的属性而是复用其他注解已有的注解属性并对其进行组合

形成新的注解从而到达到便捷的目的。这样的注解我们可以称之为复合注解。

所以在使用SpringBoot 时我们只需要@SpringBootApplication一个注解就能开启

自动配置,自动扫描的功能。

而不再需要使下面三个注解来达到同样的目的。

@Configuration

@ComponentSan

@EnnableAutoConfiguration

2.继承注解的功能

如@Controller,@Service,@Repository都继承了@Component的功能

他们的基本作用和@Component完全一样都是标明某个类是

Spring的Bean,需要Spring容器进行管理。不同之处在于对Spring bean进行了归类,从而能对不同类型的Bean进行不同的处理。

@Service代码如下



在同个注解中为同一个功能定义两个名称不一样的属性,那么这两个属性彼此互为别名

如@RequestMapping注解中的value和path它们两互为别名。如下所示:



这么做的目的在于

1.更便捷

当我们只定义一个属性的时候往往可以省略属性名如:

@RequestMapping(“/user”)

2.顾名思义

当我门定义多个属性时为了能做到顾名思义

使之达到一目了然的效果我们需要选择一个更加贴合特定场景的名称。

@RequestMapping(path = “/user”,method = RequestMethod.GET)

当然你也可以这样:

@RequestMapping(value = “/user”,method = RequestMethod.GET)

只是这样子的定义value = “/user” 不能很准确地传达代码的意图。

根据@AliasFor的使用形式我们可以将它分为三类:

1.注解内部的显性别名

在单个注解中,可以把@AliasFor声明在一对属性上标明它们彼此之间互无别名如下所示: ContextConfiguration中的value和locations是彼此的显性别名



实现要求:

1.组成别名对的每个属性都必须用@AliasFor进行注释,并且AliasFor中的值

必须指向别名对中的另一个属性

2.别名化的属性必须声明相同的返回类型

3.别名化的属性必须声明默认值

4.别名化的属性默认值必须相同

2.用于元注解属性的显性别名

如果被@AliasFor注释的属性指向的是它所在注解之外的其他注解,

那么这个属性被解释成元注解属性的别名。(称之为显性的元注解属性重写)

我们可以通过重写继承一个或多个其他注解的功能从而

使得可以更细粒度精准地控制注解层级中属性的重写,

不像Java中继承必须继承父类的所有功能。

实际上,使用@AliasFor甚至可以为元注解的value属性声明别名.

如下所示:@MyTestConfig下的xmlFiles指向的是一个元注解@ContextConfiguration的属性locations



实现要求:

1 如果一个属性是一个元注解属性的别名,那么这个属性必须用@AliasFor进行注释并且

该属性必须指向元注解属性。

2 别名化的属性必须声明相同的返回结果

3.@AliasFor的annotation属性必须引用元注解

4.被引用的元注解必须放置在声明了@AliasFor的注解类上

3 注解中的隐性别名

如果注解中的一个或多个属性声明为同一个元注解属性的属性重写(直接地或传递地重写)

那么这些注解会被当作彼此的隐性别名集来对待

结果是它们的行为类似于注解中的显性别名

如下所示:@MyTestConfig中,value,groovyScripts和xmlFiles

都是复写了@ContextConfiguration中locations属性的,因此这

三个属性是彼此的隐性别名。



注解中的可传递隐性别名

如下所示:在GroovyOrXmlTestConfig中,groovy是对上面的MyTestConfig中的groovyScripts属性显示的复写,

而xml是对@ContextConfiguration中locations属性的显示的复写,

我们就可以称groovy和xml是彼此的可传递隐性别名,因为它们实际上只是复写ContextConfiguration中的locations属性。



实现要求:

1.属于隐性别名组中的每一个属性必须使用@AliasFor进行注释,并且attribute必须引用相同元注解中的同一个属性

2.别名化的属性必须声明相同的返回类型

3.别名化的属性必须定义默认值

4.别名化的属性必须声明相同的默认值

5.注解必须引用合适的元注解

6.被引用的元注解必须放置在声明了@AliasFor的注解上

链接:https://www.jianshu.com/p/d6bba708100d

来源:简书

@AliasFor注解的更多相关文章

  1. 关于如何使用Spring里@AliasFor注解进行注解的封装

    不知道大家每次使用Spring boot的时候有没有看过它启动类里 @SpringBootApplication这个注解呢?众所周知,这个注解是一个复合注解,但是注解是不能继承元注解的属性的,也就是说 ...

  2. @AliasFor 注解

    Spring 框架提供了很丰富的注解可以让我们很方便的进行 Spring 配置,今天要讲的注解--@AliasFor之前你可能并没有关注过,因为平时开发时我们的确不太会用到. 我关注到这个注解是因为我 ...

  3. 朱晔和你聊Spring系列S1E9:聊聊Spring的那些注解

    本文我们来梳理一下Spring的那些注解,如下图所示,大概从几方面列出了Spring的一些注解: 如果此图看不清楚也没事,请运行下面的代码输出所有的结果. Spring目前的趋势是使用注解结合Java ...

  4. Spring 注解(二)注解工具类 AnnotationUtils 和 AnnotatedElementUtils

    Spring 注解(二)注解工具类 AnnotationUtils 和 AnnotatedElementUtils Spring 系列目录(https://www.cnblogs.com/binary ...

  5. Spring @AliasFor

    原文地址:https://blog.csdn.net/wolfcode_cn/article/details/80654730 在Spring的众多注解中,经常会发现很多注解的不同属性起着相同的作用, ...

  6. Spring 注解编程之注解属性别名与覆盖

    前两篇文章咱聊了深入了解了 Spring 注解编程一些原理,这篇文章我们关注注解属性方法,聊聊 Spring 为注解的带来的功能,属性别名与覆盖. 注解属性方法 在进入了解 Spring 注解属性功能 ...

  7. 品Spring:能工巧匠们对注解的“加持”

    问题的描述与方案的提出 在Spring从XML转向注解时,为了自身的开发方便,对注解含义进行了扩充(具体参考本号上一篇文章). 这个扩充直接导致了一个问题,就是需要从注解往元注解以及元元注解(即沿着从 ...

  8. 品Spring:注解终于“成功上位”

    历史还是抛弃了XML,当它逐渐尝到注解的甜头之后. 尤其是在Spring帝国,到处充满着注解的气息. 注解从一个提供附属信息的“门客”,蜕变为颇具中流砥柱的“君侯”. 注解成功登上了帝国的舞台,定会像 ...

  9. 跟Evan学Sprign编程思想 | Spring注解编程模式【译】

    Spring注解编程模式 概况 多年来,Spring Framework不断发展对注解.元注解和组合注解的支持. 本文档旨在帮助开发人员(Spring的最终用户以及Spring Framework和S ...

随机推荐

  1. 每个人都可以用C语言写的推箱子小游戏!今天你就可以写出属于自己项目~

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  2. linux(centos8):为prometheus安装grafana(grafana-7.0.3)

    一,grafana的用途 1,grafana是什么? grafana 是用 go 语言编写的开源应用, 它的主要用途是大规模指标数据的可视化展现 它是现在网络架构/应用分析中最流行的时序数据展示工具 ...

  3. centos8使用systemd/systemctl管理系统/服务

    一,systemd的用途? Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置 Systemd 的优点是功能强大,使用方便, 缺点是体系庞大,非常复杂 在cent ...

  4. 第十二章 LNMP架构之分离数据库

    一.课程回顾 1.搭建LNMP环境 1.配置官方源2.yum安装依赖3.yum安装nginx4.配置nginx5.创建用户6.启动并加入开机自启​7.上传安装包8.解压安装包9.卸载旧版本PHP10. ...

  5. 完美解决pyinstaller 打包报错找不到依赖pypiwin32 或pywin32-ctypes的错误

    报错信息 最近闲来无事,用python的tkinter库开发了一款带日程提醒的万年历桌面程序.在程序开发结束开始打包时,却发现一直报错 PyInstaller cannot check for ass ...

  6. Vue基础语法(四)

    vue的生命周期钩子函数 所有的生命周期钩子自动绑定this到上下文实例中,因此可以访问数据对property和方法进行运算,这意味着不蹦使用箭头函数来定义一个生命周期方法.参考官方文档,生命周期图 ...

  7. List集合,对象根据某个相同的属性,合并另外属性

    描述及实现: 1.List中有 Modular字段值有重复一样的2.Modular字段一样的话去重并且OrderAmount相加 HashMap<String,DataReport> te ...

  8. Flink1.9.2源码编译和使用

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. 使用阿里云镜像仓库构建国外 Docker 镜像

    使用阿里云镜像仓库下载国外镜像 在日常使用 Docker 或 K8S 的过程中,经常会需要到国外的网站中下载镜像,但是有些网站在国内是无法访问的.对于这个问题可以使用阿里云提供的镜像仓库进行下载,然后 ...

  10. Luogu P2536 [AHOI2005]病毒检测

    题意 给一个有通配符的模式串和 \(n\) 个文本串,其中 ? 可以匹配任意字符,* 可以匹配 \(0\) 或任意多个字符,求 \(n\) 个文本串中无法与模式串匹配的数量. \(\texttt{Da ...