一、注解介绍
注解就是一种标记符号,可以在代码上的关键节点(类、方法、变量、参数、包)打上标记,然后程序在编译时或者运行时就可以检测到这些标记从而执行一些自己需要的功能操作。
自定义注解的步骤可以简化成三步
1、定义注解:用@Interface创建,并加上常用的元注解和自定义注解类型元素。
2、实现注解功能:编写注解的功能,一般都是通过AOP在程序运行时去捕获这个标记从而实现。(这步很关键,也是实现自定义注解的关键)
3、使用定义注解:将注解修饰/标记到需要的程序代码中。
通过我们最常见的一个注解来解释这些注解概念:@Autowired,看下他的定义
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Autowired { boolean required() default true; }
二、元注解
根据Autowired的定义可知道,最基本的三个元注解
@Target、@Retention、@Documented(还有一个是@Inherited也算一个,但是这里Autowired没用上,我也会介绍一下)
其中,@Target和@Retention是我们定义注解主要关注的部分,而@Documented与@Inherited是我们不很关注的元注解,我会简单提一下。
1、@Documented与@Inherited
@Documented注解,是被用来指定自定义注解是否能随着被定义的java文件生成到JavaDoc文档当中。
@Inherited注解,是指定某个自定义注解如果写在了父类的声明部分,那么子类的声明部分也能自动拥有该注解。@Inherited注解只对那些@Target被定义为ElementType.TYPE的自定义注解起作用。
2、@Target
@Target注解是一个指定可以使用的范围(类、方法、变量、参数、包)
比如上面的Autowired可以使用的范围,CONSTRUCTOR、METHOD、PARAMETER、FIELD、ANNOTATION_TYPE对应下面的ElementType这个枚举类,已经有注释说明这里不再解释。
public enum ElementType { /** 类,接口(包括注解类型)或枚举的声明 */ TYPE, /** 属性的声明 */ FIELD, /** 方法的声明 */ METHOD, /** 方法形式参数声明 */ PARAMETER, /** 构造方法的声明 */ CONSTRUCTOR, /** 局部变量声明 */ LOCAL_VARIABLE, /** 注解类型声明 */ ANNOTATION_TYPE, /** 包的声明 */ PACKAGE }
3、@RetentionPolicy
@Retention注解是指用来修饰自定义注解的生命周期。
注解的生命周期有三个阶段:1、Java源文件阶段;2、编译到class文件阶段;3、运行期阶段(可以通过反射去操作目标注解)。对应下面的RetentionPolicy枚举:
public enum RetentionPolicy { /** * Annotations are to be discarded by the compiler. * 注释将被编译器丢弃 */ SOURCE, /** * Annotations are to be recorded in the class file by the compiler * but need not be retained by the VM at run time. This is the default * behavior. * 编译器将注释记录在类文件中,但不需要在运行时被VM保留。这是默认值 */ CLASS, /** * Annotations are to be recorded in the class file by the compiler and * retained by the VM at run time, so they may be read reflectively. * 编译器将注释记录在类文件中,在运行时由VM保留,因此它们可能被反射地读取 * * @see java.lang.reflect.AnnotatedElement */ RUNTIME }
三、注解类型元素
如Autowired中required就是注解类型元素
在注解中,需要声明一个变量属性,默认是public,而且必须是带()的,如required(),而且一般我们会给他加默认值,default xx,当不加这个参数就会以默认值表示。比如@Autowired,那required就是true,或者你直接使用@Autowired(required = false)。
四、自定义注解
如下,自定义了一个枚举校验的注解,文章最后链接将是走入工作中实际场景而自定义注解。
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface EnumValid { /** * fieldName * @return */ String name() default "fieldName"; // 注解类型变量... }
在DTO类中使用
public class ReqDTO { @EnumValid(name = "typeName") private String typeName; }
具体作用文章未实现,放在了下一篇文章。
好了,这篇文章讲到这里,下一篇根据需求场景来给大家介绍如何实现自定义注解满足我们的需求。
到此这篇关于深入理解注解与自定义注解的一些概念的文章就介绍到这了,更多相关注解与自定义注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!