深入理解注解与自定义注解的一些概念

 更新时间:2021年06月08日 08:38:03   作者:神韵499  
今天给大家带来的文章是注解的相关知识,本文围绕着注解与自定义注解的一些概念展开,文中详细介绍了这些知识,需要的朋友可以参考下

一、注解介绍

注解就是一种标记符号,可以在代码上的关键节点(类、方法、变量、参数、包)打上标记,然后程序在编译时或者运行时就可以检测到这些标记从而执行一些自己需要的功能操作。

自定义注解的步骤可以简化成三步

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;
}

具体作用文章未实现,放在了下一篇文章。

好了,这篇文章讲到这里,下一篇根据需求场景来给大家介绍如何实现自定义注解满足我们的需求

到此这篇关于深入理解注解与自定义注解的一些概念的文章就介绍到这了,更多相关注解与自定义注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java:

    Java:"失效"的private修饰符

    本文主要介绍Java 失效的private修饰符,这里整理了相关资料说明private 修饰符的作用,如何使用并与C++ 做比较,有兴趣的小伙伴可以参考下
    2016-08-08
  • SpringBoot实现文件上传功能

    SpringBoot实现文件上传功能

    这篇文章主要为大家详细介绍了SpringBoot实现文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java十大经典排序算法的实现图解

    Java十大经典排序算法的实现图解

    Java常见的排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。本文详解介绍Java十大十大经典排序算法的实现以及图解,需要的可以参考一下
    2022-03-03
  • Java中计算时间差的方法

    Java中计算时间差的方法

    这篇文章主要介绍了Java中计算时间差的方法,实例分析了java常见的三种计算时间差的技巧,需要的朋友可以参考下
    2015-06-06
  • redis做服务间通信工具的项目示例

    redis做服务间通信工具的项目示例

    Redis是一种高效的服务间通信工具,它以键值对的形式存储数据,并支持多种数据类型和丰富的操作,本文主要介绍了redis做服务间通信工具的项目示例,感兴趣的可以了解一下
    2023-08-08
  • JVM如何处理异常深入详解

    JVM如何处理异常深入详解

    异常处理的两大元素:抛出异常、捕获异常,非正常处理的两个方法。下面这篇文章主要给大家介绍了关于JVM如何处理异常的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2019-01-01
  • 基于redis setIfAbsent的使用说明

    基于redis setIfAbsent的使用说明

    这篇文章主要介绍了基于redis setIfAbsent的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • SpringBoot中使用tkMapper的方法详解

    SpringBoot中使用tkMapper的方法详解

    这篇文章主要介绍了SpringBoot中使用tkMapper的方法详解
    2022-11-11
  • 浅谈Java中的克隆close()和赋值引用的区别

    浅谈Java中的克隆close()和赋值引用的区别

    下面小编就为大家带来一篇浅谈Java中的克隆close()和赋值引用的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • Spring aop+反射实现电话号加密

    Spring aop+反射实现电话号加密

    线上项目涉及大量查询接口中,存在电话号明文展示不合规的问题。如果对每个接口返回结果中电话号相关字段修改相关代码逻辑,则工作量较大花费时间多。因此设计电话号加密注解,减少工作量。
    2021-06-06

最新评论