【Spring知识体系】1.1 Java 注解(Annotation)

文章目录

    • 1.1 注解(Annotation)
      • 1.1.1 什么是注解
      • 1.1.2 内置注解
      • 1.1.3 元注解(5种)
      • 1.14 自定义注解
      • 1.15 注解使用场景介绍
      • ※ 本文小结


1.1 注解(Annotation)

1.1.1 什么是注解

注解的定义:它提供了一种安全的类似注释的机制,用来将任何信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素(类、方法、成员变量)加上更直观、更明了的说明,这些说明信息与程序的业务逻辑无关,并且供指定的工具或框架使用。

注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用,包含在 java.lang.annotation 包中。

1.1.2 内置注解

  • @Deprecated:@Deprecated 所标注内容,不再被建议使用。——会发出程序元素(类、方法、成员变量)过时的提醒警告。
  • @Override:@Override 只能标注方法,表示该方法覆盖父类中的方法。——提示子类重写父类中被 @Override 修饰的方法。
  • @SuppressWarnings:@SuppressWarnings 所标注内容产生的警告,编译器会对这些警告保持静默。——阻止警告,例如忽略因调用被 @Deprecated 注解的方法而发出的警告。
  • @SafeVarargs:参数安全类型注解。它的目的是提醒开发者不要用参数做一些不安全的操作,它的存在会阻止编译器产生 unchecked 这样的警告。它是在 Java 1.7 的版本中加入的。
  • @FunctionalInterface:函数式接口注解,这个是在 Java 1.8 版本引入的新特。函数式接口(Functional Interface)就是一个具有一个方法的普通接口。

1.1.3 元注解(5种)

java.lang.annotation 提供了5种元注解,专门注解其他的注解。

  • @Retention:什么时候使用该注解。
  • @Target:注解用于什么地方。
  • @Documented:注解是否将包含在 JavaDoc 中。
  • @Inherited:是否允许子类继承该注解。
  • @Repeatable:指定注解可重复使用。

1. @Retention 定义注解的生命周期

注解 @Retention 的定义:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/**
     * Returns the retention policy.
     * @return the retention policy
     */
    RetentionPolicy value();
}
package java.lang.annotation;
public enum RetentionPolicy {
SOURCE,            /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了  */

CLASS,             /* 编译器将Annotation存储于类对应的.class文件中。默认行为  */

RUNTIME            /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
}
  • RetentionPolicy.SOURCE:信息之保留在源码中,编译时将丢弃。——在编译阶段丢弃。这些注解在编译结束之后不再有任何意义,所以他们不会写入字节码。@Override@SuppressWarnings 都属于这类注解。
  • RetentionPolicy.CLASS:信息只保留在源码和编译后的class文件中,但加载到JVM时将被丢弃。——在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。
  • RetentionPolicy.RUNTIME:信息将保留在源码、class文件以及运行时。——始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义注解通常使用这种方式。

2. @Target表示注解用于什么地方

注解 @Target 的定义:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();
}
package java.lang.annotation;

public enum ElementType {
    TYPE,               /* 类、接口(包括注释类型)或枚举声明  */

    FIELD,              /* 字段声明(包括枚举常量)  */

    METHOD,             /* 方法声明  */

    PARAMETER,          /* 参数声明  */

    CONSTRUCTOR,        /* 构造方法声明  */

    LOCAL_VARIABLE,     /* 局部变量声明  */

    ANNOTATION_TYPE,    /* 注释类型声明  */

    PACKAGE             /* 包声明  */
}
  • ElementType.TYPE:用于描述类、接口(包括注解类型)或enum声明。

  • ElementType.FIELD:成员变量、对象、属性(包括enum实例)。

  • ElementType.METHOD:用于描述方法。

  • ElementType.PARAMETER:用于描述参数。

  • ElementType.CONSTRUCTOR:用于描述构造器。

  • ElementType.LOCAL_VARIABLE:用于描述局部变量。

  • ElementType.ANNOTATION_TYPE:用于注解声明(应用于另一个注解上)。

  • ElementType.PACKAGE:用于描述包。

3. @Documented 是一个简单的 Annotations 标记注解

@Documented 表示是否将注解信息添加在 Java 文档中。

4. @Inherited 定义注解和子类的关系

@Inherited 元注解是一个标记注解,阐述了某个被标注的类型是被继承的。如果一个使用了 @Inherited 修饰的 annotation(注解) 类型被用于一个class(类),那么这个 annotation 将被用于该 class 的子类。

5. @Repeatable 指定注解可重复使用

使用 @Repeatable 修饰表示该注解可以为重复使用。

1.14 自定义注解

元注解是负责注解自定义注解的。

自定义注解时是有一些规则限制的,具体如下:

  • Annotation 型定义为 @interface ,所有的 Annotation 会自动继承 java.lang.annotation.Annotation 这一接口,并且不能再去继承别的类或是接口。
  • 参数成员只能用 public 或默认(default)这两个访问权修饰。
  • 参数成员只能用基本类型 byteshortcharintlongfloatdoubleboolean 八种基本数据类型和 StringEnumClassAnnotation 等数据类型,以及这一些类型的数组。
  • 要获取类方法和字段的注解信息,必须通过 Java 的反射技术来获取 Annotation 对象,因为除此之外没有其他获取注解对象的方法。
  • 注解也可以没有定义成员。

Annotation 的定义:

package java.lang.annotation;
public interface Annotation {

    boolean equals(Object obj);

    int hashCode();

    String toString();

    Class<? extends Annotation> annotationType();
}

1.15 注解使用场景介绍

注解应用的场景很多,下面列举几个使用场景。

(1)使用注解做 bean 的属性值校验。

例如在开发 Java 服务器端代码时,会要求对外部传来的参数合法性进行验证。hibernate-validator 提供了一些常用的参数校验注解。

(2)使用注解做权限控制。

例如 shiro 框架中有5个权限注解,我们也可以自定义注解进行权限控制。

(3)代替配置文件功能。

像 Spring 基于注解的配置,减少了 xml 的配置。

(4)可以生成文档。

像 Java 代码注释中的 @see、@param 等。


※ 本文小结

在这里插入图片描述


来源:《Spring 快速入门 / 崔彦威,卢欣欣,王倩著》 学习笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/440847.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java中接口新增的方法(默认方法,静态方法,私有方法)

Java中接口新增的方法&#xff08;默认方法&#xff0c;静态方法&#xff0c;私有方法&#xff09;

遗传算法理解与代码实战(二)- demo(python+deap)

前文介绍了遗传算法&#xff0c;并且手动python代码进行了实践&#xff0c;但是在遇到复杂的问题时&#xff08;遗传算法理解与代码实战&#xff08;三&#xff09;会介绍&#xff09;&#xff0c;手写代码很麻烦&#xff0c;所以需要借助专门的遗传算法库来实现&#xff0c;这…

使用Python快速提取PPT中的文本内容

直接提取PPT中的文本内容可以方便我们进行进一步处理或分析&#xff0c;也可以直接用于其他文档的编撰。通过使用Python程序&#xff0c;我们可以快速批量提取PPT中的文本内容&#xff0c;从而实现高效的信息收集或对其中的数据进行分析。本文将介绍如何使用Python程序提取Powe…

Vue | 基于 vue-admin-template 项目的跨域问题解决方法

目录 一、现存问题 二、解决方法 2.1 修改的第一个地方 2.2 修改的第二个地方 2.3 修改的第三个地方 自存 一、现存问题 报错截图如下&#xff1a; 二、解决方法 2.1 修改的第一个地方 在 .env.development 文件中&#xff1a; # base api # VUE_APP_BASE_API /d…

阿里云服务器地域和可用区选择及关系说明

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

如何使用Python的Open3D 库LAS对点云进行重建

在 Python 中对点云进行重建也可以使用 PCL 库&#xff0c;不过更为常见的是使用 Open3D 库。Open3D 是一个开源的现代化 3D 数据处理库&#xff0c;提供了许多用于点云和三维几何数据处理的功能&#xff0c;包括点云重建。 下面是一个简单的示例代码&#xff0c;演示了如何使…

人工智能|机器学习——k-近邻算法(KNN分类算法)

1.简介 k-最近邻算法&#xff0c;也称为 kNN 或 k-NN&#xff0c;是一种非参数、有监督的学习分类器&#xff0c;它使用邻近度对单个数据点的分组进行分类或预测。虽然它可以用于回归问题&#xff0c;但它通常用作分类算法&#xff0c;假设可以在彼此附近找到相似点。 对于分类…

灵魂指针,教给(二)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 一、数组名的理解 二、使用指针访问数组 三、一维数组传参本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组…

Go语言物联网开发安科瑞ADW300/4G电能表数据上传mqtt平台-电表接线到传输数据完整流程

电能表功能说明 ADW300是方便用户进行用电监测、集抄和管理&#xff0c;可灵活安装在配电箱中&#xff0c;可用于电力运维、环保监管等在线监测类平台中。我们本案例是用于工业售电公司对出售电的管理&#xff0c;设备可以监控用电情况、故障监控及警报&#xff0c;售电公司可…

LeetCode的使用方法

LeetCode的使用方法 一、LeetCode是什么&#xff1f;1.LeetCode简介2.LeetCode官网 二、LeetCode的使用方法1.注册账号2.力扣社区力扣编辑器 2.1 讨论发起讨论参与讨论关注讨论 2.2 文章撰写文章关注文章 3.力扣面试官版测评面试招聘竞赛 4.力扣学习LeetBook 书架我的阅读猜您喜…

使用Opencv库直接进行人脸检测

import cv2abs_path cv2.__file__ xml_path abs_path.rsplit("/",1)[0] "/data/haarcascade_frontalface_default.xml"# 加载人脸检测器 face_cascade cv2.CascadeClassifier(xml_path)# 加载图像 img cv2.imread(/media/datasets/face/liuyigei_duo.…

C++vector的使用方法

文章目录 一、vector的介绍1. 文档链接2. 简要介绍 二、vector的使用1.vector的定义&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;拷贝构造函数&#xff08;2&#xff09;赋值重载 2. vector 增删查改&#xff08;1&#xff09;operator []&#xff08;2&#x…

地址分词 | EXCEL批量进行地址分词,标准化为十一级地址

一 需求 物流需要对用户输入地址进行检查&#xff0c;受用户录入习惯地址可能存在多种问题。 地址标准化是基于地址引擎和地址大数据模型&#xff0c;自动将地址信息标准化为省、市、区市县、街镇、小区、楼栋、单元、楼层、房屋、房间等元素&#xff0c;补充层级缺失数据、构建…

C语言从入门到精通 第十一章(文件操作)

写在前面&#xff1a; 本系列专栏主要介绍C语言的相关知识&#xff0c;思路以下面的参考链接教程为主&#xff0c;大部分笔记也出自该教程。除了参考下面的链接教程以外&#xff0c;笔者还参考了其它的一些C语言教材&#xff0c;笔者认为重要的部分大多都会用粗体标注&#xf…

【学习笔记】微信运营工具

办公工具 在线 http://uzer.meMindMaster即刻&#xff08;APP&#xff09;收趣&#xff08;APP&#xff09;MindMaster&#xff08;app&#xff09; 安装 文字工具 Mega Emoji 文字云 石墨文档 giftools 音频工具 变声实验室&#xff08;APP&#xff09; 录音APP&am…

本鲸多方位助力创业者高效对接创新创业机遇

在科技创新的浪潮中&#xff0c;创业者们不断探索着新的商业机会&#xff0c;寻求着创新创业的道路。然而&#xff0c;面对复杂多变的市场环境和激烈的竞争压力&#xff0c;如何高效对接创新创业机遇成为了摆在创业者面前的重要课题。 本鲸依托海南本鲸投资有限公司和重庆本鲸…

Flink 物理执行图

文章目录 物理执行图一、Task二、ResultPartition三、ResultSubpartition四、InputGate五、InputChannel 物理执行图 JobManager根据ExecutionGraph对作业进行调度&#xff0c;并在各个TaskManager上部署任务。这些任务在TaskManager上的实际执行过程就形成了物理执行图。物理…

Leetcode - 周赛387

目录 一&#xff0c;3069. 将元素分配到两个数组中 I 二&#xff0c;3070. 元素和小于等于 k 的子矩阵的数目 三&#xff0c;3071. 在矩阵上写出字母 Y 所需的最少操作次数 四&#xff0c;3072. 将元素分配到两个数组中 II 一&#xff0c;3069. 将元素分配到两个数组中 I 本…

[递归、搜索、回溯]----递归

前言 作者&#xff1a;小蜗牛向前冲 专栏&#xff1a;小蜗牛算法之路 专栏介绍&#xff1a;"蜗牛之道&#xff0c;攀登大厂高峰&#xff0c;让我们携手学习算法。在这个专栏中&#xff0c;将涵盖动态规划、贪心算法、回溯等高阶技巧&#xff0c;不定期为你奉上基础数据结构…

freeRTOS20240308

1.总结任务的调度算法&#xff0c;把实现代码再写一下 2.总结任务的状态以及是怎么样进行转换的