今天在自定义注解的时候,原计划实现一个类似于Spring中的注解@Component的功能,如果稍有留意一下,会发现,在Spring中我们常见的注解,其实都继承了@Component注解;如下图所示:

如上图所示,我们可以看到,我们常见的注解都继承了注解@Component,而spring在启动时进行类扫描的时候,也是扫描候选类上是否有携带@Component注解,有携带的话标记为候选资源,否则的话不进行扫描;

但是,我们的原生java是不支持直接获取当前类的所实现的注解的注解的;也就是说,我使用注解A标记了注解B,然后将注解B添加到类或者是方法上后,通过反射获取到当前类,无法直接获取到当前类是否有被注解A所标记;

那么,在spring中是如何实现这种注解的集成@Component的呢;在这里,使用代码简单实现一下注解的继承;

首先,先创建一个Maven工程,然后我们自定义一个注解@Component

/*** 基础注解,被此注解标记的类在spring扫描的包路径下的话会被加入候选资源中*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyComponent {String name() default "";
}

创建好基础注解后,我们再来创建一个注解@MyService,让这个注解继承基础注解@Component,代码如下:

/*** 类 名: MyService* 描 述: 自定义注解 -- 服务层 -- 定义在类、接口、枚举上的* @author: jiaYao*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@MyComponent
public @interface MyService {}

准备好这些工作后,再来创建一个测试类,让这个测试类被注解@MySerice标记;

@MyService
public class UserService {
}

现在我们再写一个main方法即可开始测试,代码如下:

import javax.annotation.*;
import java.lang.annotation.*;/*** 类 名: Main* 描 述: 测试组合注解* @author: jiaYao*/
public class Main {public static void main(String[] args) {Class<UserService> classz = UserService.class;getAnnos(classz);}/*** interface java.lang.annotation.Documented 等 存在循环,导致内存溢出,所以需要排除java的源注解* @param classz*/private static void getAnnos(Class<?> classz){Annotation[] annotations = classz.getAnnotations();for (Annotation annotation : annotations) {if (annotation.annotationType() != Deprecated.class &&annotation.annotationType() != SuppressWarnings.class &&annotation.annotationType() != Override.class &&annotation.annotationType() != PostConstruct.class &&annotation.annotationType() != PreDestroy.class &&annotation.annotationType() != Resource.class &&annotation.annotationType() != Resources.class &&annotation.annotationType() != Generated.class &&annotation.annotationType() != Target.class &&annotation.annotationType() != Retention.class &&annotation.annotationType() != Documented.class &&annotation.annotationType() != Inherited.class) {if (annotation.annotationType() == MyComponent.class){System.out.println(" 存在注解 @MyComponent ");}else{getAnnos(annotation.annotationType());}}}}
}

通过程序的输出语句,我们在控制台可以看到有输出:

 存在注解 @MyComponent

通过这种方式,我们就可以实现组合注解功能了,这样我们在自定义注解时,可以将很多具有公共属性的注解进行提取,通过注解继承的方式完成组合注解的实现了;

是不是很简单~~~

java 注解原理_在java中实现组合注解原理分析(注解继承)相关推荐

  1. java参数值注入_在springboot中使用注解将值注入参数的操作

    后端的许多管理系统需要登陆者的信息,如shiro登陆后,会将登陆者的信息存储在shiro的session,在使用时需要多行代码获取用户信息.可以把获取在shiro中的登陆者信息封装在一个类中,使用时获 ...

  2. java final 类_在Java中,final修饰的类有什么特点

    展开全部 关于Java中的32313133353236313431303231363533e4b893e5b19e31333264663736final(2010-09-09 14:19:48)转载▼ ...

  3. java 字节码增强原理_深入浅出Java探针技术1--基于java agent的字节码增强案例

    Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...

  4. java coin介绍_代码示例中的Java 7:Project Coin

    java coin介绍 该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更 ...

  5. java converter转换器_在SpringMVC中设置自定义类型转换器Converter

    前言 在SpringMVC中为我们提供了许多内置的类型转换器,当我们在HTML表单中发起一个请求时,Spring会根据表单项中name属性的值映射到POJO的属性名,调用相对性属性的set方法帮我们把 ...

  6. java skip函数_【Java必修课】图说Stream中的skip()和limit()方法及组合使用

    1 简介 本文将讲解Java 8 Stream中的两个方法:skip()和limit().这两个方法是Stream很常用的,不仅各自会被高频使用,还可以组合出现,并能实现一些小功能,如subList和 ...

  7. java智能卡开发_《Java智能卡原理与应用开发》PDF 下载

    图书目录: 封面 扉页 版权页 内容简介 出版说明 前言 序 目录 第一部分 Java智能卡编程基础 第1章 绪言 1.1 智能卡简介 1.2 Java智能卡简介 1.3 发展前景 1.3.1 智能卡 ...

  8. java logging包_用JDK中提供的java.util.logging.*包创建Logger对象----原创

    由于项目中用到了Applet与Servlet之间(客户端用Applet.Server端用Servlet)的通信,要求: 1:>客户端与服务端必须出Log. 2:>浏览器在加载Applet时 ...

  9. java jar 目录_将Java类路径中的所有jar包括在一个目录中

    有没有一种方法可以将所有的jar文件包含在类路径的目录中? 我正在尝试java -classpath lib / *.jar :. my.package.Program,它无法找到当然在这些罐子里的类 ...

最新文章

  1. 如何使用 Python 构建推荐引擎?
  2. Odoo10 启动选项
  3. 泡泡玛特,走出“盲盒”?
  4. (十一)进阶算法之“搜索排序”
  5. 【转】漫画:Bitmap算法
  6. 工作304:uni返回上一页面
  7. JS将各值拼接JSON串小例
  8. loader-wizard.php,ioncube扩展loader-wizard的安装详细图文教程
  9. python 穷举法 算24点(史上最简短代码)
  10. vue使用ntko控件完成word上传、html上传
  11. php怎样做艺术字体,用ps打造科幻艺术字体
  12. 汇编语言(一)-基础知识
  13. urlencode quote unquote (url 中带中文参数)
  14. 微机原理-第五章 微型计算机接口和外设的数据传输
  15. 【C语言程序设计】实验 6
  16. 摸鱼软件1:自动抓屏截图PPT软件
  17. 《强化学习周刊》第47期:MEDAL、RL4Rec、H-GRAIL 非情景强化学习
  18. vs2019 无法打开包括文件:“SDKDDKVer.h”: No such file or directory的有效解决方案
  19. 【笔记】python的遍历字典:遍历所有键值对(方法items())、遍历字典中的所有键(方法keys())、按特定顺序遍历字典中的所有键、遍历字典中的所有值(方法values())、函数set()
  20. iNFTnews丨阿迪达斯、汇丰银行等入驻的沙盒元宇宙土地该如何估价?

热门文章

  1. 当Node.js遇见Docker
  2. Android Studio NDK 开发配置
  3. 深入理解JVM--类的执行机制
  4. Python isdigit() isalnum()
  5. 转:【HTTP】常见错误码说明
  6. Android使用SeekBar
  7. BZOJ 1013: [JSOI2008]球形空间产生器sphere( 高斯消元 )
  8. js中的cookie的读写操作
  9. air写文件 SecurityError: fileWriteResource 时报错的解决方法
  10. SQL查询中用replace替换ntext,text字段的各种方法总结