java 注解原理_在java中实现组合注解原理分析(注解继承)
今天在自定义注解的时候,原计划实现一个类似于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中实现组合注解原理分析(注解继承)相关推荐
- java参数值注入_在springboot中使用注解将值注入参数的操作
后端的许多管理系统需要登陆者的信息,如shiro登陆后,会将登陆者的信息存储在shiro的session,在使用时需要多行代码获取用户信息.可以把获取在shiro中的登陆者信息封装在一个类中,使用时获 ...
- java final 类_在Java中,final修饰的类有什么特点
展开全部 关于Java中的32313133353236313431303231363533e4b893e5b19e31333264663736final(2010-09-09 14:19:48)转载▼ ...
- java 字节码增强原理_深入浅出Java探针技术1--基于java agent的字节码增强案例
Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...
- java coin介绍_代码示例中的Java 7:Project Coin
java coin介绍 该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更 ...
- java converter转换器_在SpringMVC中设置自定义类型转换器Converter
前言 在SpringMVC中为我们提供了许多内置的类型转换器,当我们在HTML表单中发起一个请求时,Spring会根据表单项中name属性的值映射到POJO的属性名,调用相对性属性的set方法帮我们把 ...
- java skip函数_【Java必修课】图说Stream中的skip()和limit()方法及组合使用
1 简介 本文将讲解Java 8 Stream中的两个方法:skip()和limit().这两个方法是Stream很常用的,不仅各自会被高频使用,还可以组合出现,并能实现一些小功能,如subList和 ...
- java智能卡开发_《Java智能卡原理与应用开发》PDF 下载
图书目录: 封面 扉页 版权页 内容简介 出版说明 前言 序 目录 第一部分 Java智能卡编程基础 第1章 绪言 1.1 智能卡简介 1.2 Java智能卡简介 1.3 发展前景 1.3.1 智能卡 ...
- java logging包_用JDK中提供的java.util.logging.*包创建Logger对象----原创
由于项目中用到了Applet与Servlet之间(客户端用Applet.Server端用Servlet)的通信,要求: 1:>客户端与服务端必须出Log. 2:>浏览器在加载Applet时 ...
- java jar 目录_将Java类路径中的所有jar包括在一个目录中
有没有一种方法可以将所有的jar文件包含在类路径的目录中? 我正在尝试java -classpath lib / *.jar :. my.package.Program,它无法找到当然在这些罐子里的类 ...
最新文章
- 如何使用 Python 构建推荐引擎?
- Odoo10 启动选项
- 泡泡玛特,走出“盲盒”?
- (十一)进阶算法之“搜索排序”
- 【转】漫画:Bitmap算法
- 工作304:uni返回上一页面
- JS将各值拼接JSON串小例
- loader-wizard.php,ioncube扩展loader-wizard的安装详细图文教程
- python 穷举法 算24点(史上最简短代码)
- vue使用ntko控件完成word上传、html上传
- php怎样做艺术字体,用ps打造科幻艺术字体
- 汇编语言(一)-基础知识
- urlencode quote unquote (url 中带中文参数)
- 微机原理-第五章 微型计算机接口和外设的数据传输
- 【C语言程序设计】实验 6
- 摸鱼软件1:自动抓屏截图PPT软件
- 《强化学习周刊》第47期:MEDAL、RL4Rec、H-GRAIL 非情景强化学习
- vs2019 无法打开包括文件:“SDKDDKVer.h”: No such file or directory的有效解决方案
- 【笔记】python的遍历字典:遍历所有键值对(方法items())、遍历字典中的所有键(方法keys())、按特定顺序遍历字典中的所有键、遍历字典中的所有值(方法values())、函数set()
- iNFTnews丨阿迪达斯、汇丰银行等入驻的沙盒元宇宙土地该如何估价?
热门文章
- 当Node.js遇见Docker
- Android Studio NDK 开发配置
- 深入理解JVM--类的执行机制
- Python isdigit() isalnum()
- 转:【HTTP】常见错误码说明
- Android使用SeekBar
- BZOJ 1013: [JSOI2008]球形空间产生器sphere( 高斯消元 )
- js中的cookie的读写操作
- air写文件 SecurityError: fileWriteResource 时报错的解决方法
- SQL查询中用replace替换ntext,text字段的各种方法总结