Spring中存在很多注解组合的情况,例如@RestController

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController { /**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
* @since 4.0.1
*/
@AliasFor(annotation = Controller.class)
String value() default ""; }

@RestController就是@Controller、@ResponseBody两个注解的组合,同时产生两个注解的作用。

本人一开始以为这是Java的特性,Java能够通过注解上的注解实现自动组合注解的效果。于是写了这样一段代码

/**
* @author Fcb
* @date 2020/6/23
* @description
*/
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyComponent {
}
/**
* @author Fcb
* @date 2020/6/23
* @description
*/
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@MyComponent
public @interface MyController {
}
@MyController
public class AnnotatedService {
}

结果测试发现翻车

/**
* @author Fcb
* @date 2020/6/23
* @description
*/
public class Test { public static void main(String[] args) {
Annotation[] annotations = AnnotatedService.class.getAnnotations();
for (Annotation anno : annotations) {
System.out.println(anno.annotationType());
System.out.println(anno.annotationType() == MyComponent.class);
}
}
}

打印结果如下:

interface com.example.demo.anno.MyController
false

经过本人查阅资料,发现我想要的那个注解组合注解的功能是Spring自己实现的。。通过Spring中的AnnotationUtils.findAnnotation(类,注解)方法来判断某个类上是否能找到组合的注解。

比如现在我想知道AnnotatedService这个类上是否存在@MyComponent注解,毕竟这是我一开始的目的(通过组合减少注解),我可以调用一下代码

/**
* @author Fcb
* @date 2020/6/23
* @description
*/
public class Test { public static void main(String[] args) {
Annotation[] annotations = AnnotatedService.class.getAnnotations();
System.out.println(AnnotationUtils.findAnnotation(AnnotatedService.class, MyComponent.class));
}
}

打印如下:

@com.example.demo.anno.MyComponent()

假如传入的注解是一个不存在的值,则会返回null,示例如下:

/**
* @author Fcb
* @date 2020/6/23
* @description
*/
public class Test { public static void main(String[] args) {
Annotation[] annotations = AnnotatedService.class.getAnnotations();
System.out.println(AnnotationUtils.findAnnotation(AnnotatedService.class, OtherAnno.class));
}
}

控制台打印:

null

总结:Java本身没有实现 通过标记注解 来组合注解的功能。假如我们自定义注解时需要可以使用Spring的AnnotationUtils.findAnnotation()的方法帮助我们实现。

希望这篇文章对你有帮助~~~有空的话记得顺手点赞呀~

Spring:如何实现注解的组合的更多相关文章

  1. Spring Boot @Condition 注解,组合条件你知道吗

    上一篇文章 你应该知道的 @ConfigurationProperties 注解的使用姿势,这一篇就够了 介绍了如何通过 @ConfigurationProperties 注解灵活读取配置属性,这篇文 ...

  2. 【转】Spring Boot @Condition 注解,组合条件你知道吗

    原文:https://www.cnblogs.com/FraserYu/p/11280420.html 上一篇文章 你应该知道的 @ConfigurationProperties 注解的使用姿势,这一 ...

  3. JavaEE开发之Spring中的条件注解、组合注解与元注解

    上篇博客我们详细的聊了<JavaEE开发之Spring中的多线程编程以及任务定时器详解>,本篇博客我们就来聊聊条件注解@Conditional以及组合条件.条件注解说简单点就是根据特定的条 ...

  4. Spring 的@Scheduled注解实现定时任务运行和调度

    Spring 的@Scheduled注解实现定时任务运行和调度 首先要配置我们的spring.xml   ---  即spring的主配置文件(有的项目中叫做applicationContext.xm ...

  5. Spring基于纯注解方式的使用

    经过上篇xml与注解混合方式,对注解有了简单额了解,上篇的配置方式极大地简化了xml中配置,但仍有部分配置在xml中进行,接下来我们就通过注解的方式将xml中的配置用注解的方式实现,并最终去掉xml配 ...

  6. Spring之缓存注解@Cacheable

    https://www.cnblogs.com/fashflying/p/6908028.html https://blog.csdn.net/syani/article/details/522399 ...

  7. Spring的Cache注解

    Spring的Cache注解如下所示: @CacheConfig:主要用于配置该类中会用到的一些共用的缓存配置.在这里@CacheConfig(cacheNames = "users&quo ...

  8. Spring 3.0 注解

    原文 :http://www.blogjava.net/ashutc/archive/2011/04/14/348270.html 另两 参考博客 : http://kingtai168.iteye. ...

  9. Spring的相关注解

    说明写在最前面:摘录于   博客园--受伤滴小萝卜   文章 文章链接受伤滴小萝卜文章--Spring注解 本文章只用作学习和帮助其他人学习记录使用 Spring 注解学习笔记 声明Bean的注解: ...

随机推荐

  1. 五、Java - 集合

    一.集合 Java 中的集合类存放于 java.util 包中,是一个存放对象的容器. 集合存放的是对对象的引用,对象本身还是存在于 JVM 堆内存中. 存放的是对象,即引用数据类型,对于基本数据类型 ...

  2. rpm解决Jenkins安装报错

    安装Jenkins出现的问题rpm安装新建路径存放地址mkdir /home/jenkins 下载地址https://pkg.jenkins.io/redhat-stable/jenkins-2.20 ...

  3. 资源在windows编程中的应用----菜单

    资源在Windows编程中的应用 资源 加速键.位图.光标.对话框.菜单.字符串.工具条 1.菜单的创建 菜单由以下组成部分: (1)窗口主菜单条 (2)下拉式菜单框 (3)菜单项热键标识 (4)菜单 ...

  4. Rocket - jtag - JtagTap

    https://mp.weixin.qq.com/s/0u9jM2u-FkTlrk3QNuZaBw 简单介绍JtagTap的实现. 1. 简单介绍 定义TAP(Test Access Port)所需要 ...

  5. Rocket - tilelink - Bundles

    https://mp.weixin.qq.com/s/jrqBg2AIpQogBrpwNXjmwg   简单介绍Bundles文件中对TileLink规范(1.7.1)的定义. 参考链接:https: ...

  6. 【Mybatis】mybatis3入门

    mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可 ...

  7. 一文说通Dotnet Core的中间件

    前几天,公众号后台有朋友在问Core的中间件,所以专门抽时间整理了这样一篇文章.   一.前言 中间件(Middleware)最初是一个机械上的概念,说的是两个不同的运动结构中间的连接件.后来这个概念 ...

  8. Java并发编程 (五) 线程安全性

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.安全发布对象-发布与逸出 1.发布与逸出定义 发布对象 : 使一个对象能够被当前范围之外的代码所使用 ...

  9. Java实现 LeetCode 713 乘积小于K的子数组(子集数量+双指针)

    713. 乘积小于K的子数组 给定一个正整数数组 nums. 找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100 输出: 8 解 ...

  10. Java实现 蓝桥杯VIP 算法训练 开心的金明

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱 ...