【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 快速入门 / 崔彦威,卢欣欣,王倩著》 学习笔记

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电力物联网系统设计

电力物联网系统设计 简介 在新能源行业从业多年&#xff0c;参与和负责过大大小小的的项目&#xff0c;发电侧、电网侧、用户侧系统都有过实际的项目经验&#xff0c;这些项目或多或少都有物联网采集方面的需求&#xff0c;本篇文章将会对电力行业物联网经验做一个总结分享。 …

2.4_1 死锁的概念

文章目录 2.4_1 死锁的概念&#xff08;一&#xff09;什么是死锁&#xff08;二&#xff09;死锁、饥饿、死循环的区别&#xff08;三&#xff09;死锁产生的必要条件&#xff08;四&#xff09;什么时候会发生死锁&#xff08;五&#xff09;死锁的处理策略 总结 2.4_1 死锁的…

Windows 安装 Xinference

Windows 安装 Xinference 0. 引言1. 创建虚拟环境2. 安装 pytorch3. 安装 llama_cpp_python4. 安装 chatglm-cpp5. 安装 Xinference6. 设置 model 路径7. 启动 Xinference8. 查看 Cluster Information 0. 引言 Xorbits Inference&#xff08;Xinference&#xff09;是一个性能…

3D-Genome | Hi-C互作矩阵归一化指南

Hi-C 是一种基于测序的方法&#xff0c;用于分析全基因组染色质互作。它已广泛应用于研究各种生物学问题&#xff0c;如基因调控、染色质结构、基因组组装等。Hi-C 实验涉及一系列生物化学反应&#xff0c;可能会在输出中引入噪声。随后的数据分析也会产生影响最终输出噪声&…

蓝桥杯2023年-买瓜(dfs,类型转换同样耗时)

题目描述 小蓝正在一个瓜摊上买瓜。瓜摊上共有 n 个瓜&#xff0c;每个瓜的重量为 Ai 。 小蓝刀功了得&#xff0c;他可以把任何瓜劈成完全等重的两份&#xff0c;不过每个瓜只能劈一刀。 小蓝希望买到的瓜的重量的和恰好为 m 。 请问小蓝至少要劈多少个瓜才能买到重量恰好…

匿名内部类

隐藏了名字的内部类 javap 反编译命令 格式: new 类名或者接口名(){重写方法};

Windows下PostgreSQL安装教程

一、下载 https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

二本双非|逆袭985/211只要做好这3件事

我的本科学校就是双非&#xff0c;但是我并不觉得考研是一件非常容易地事情&#xff0c;并且我身边的同学也没有一个觉得考研很轻松。可能网上很多经验贴说自己双非上岸985&#xff0c;二本上岸985&#xff0c;我觉得这是大家陷入了互联网时代的信息茧房。 考研不管是对985/211…

word里面文字为什么会自动另起一行

有时候我们从别处复制过来的内容&#xff0c;一行还未完经常会自动另起一行&#xff0c;这是怎么回事呢&#xff1f;大多是回车符&#xff08;WORD的段落标记&#xff09;导致的&#xff0c;操作方法如下&#xff1a; 两端对齐

设计模式-行为型模式-职责链模式

在软件系统运行时&#xff0c;对象并不是孤立存在的&#xff0c;它们可以通过相互通信协作完成某些功能&#xff0c;一个对象在运行时也将影响到其他对象的运行。行为型模式&#xff08;Behavioral Pattern&#xff09;关注系统中对象之间的交互&#xff0c;研究系统在运行时对…

Learn OpenGL 02 你好,三角形

图形渲染管线 图形渲染管线的每个阶段的抽象展示。要注意蓝色部分代表的是我们可以注入自定义的着色器的部分 首先&#xff0c;我们以数组的形式传递3个3D坐标作为图形渲染管线的输入&#xff0c;用来表示一个三角形&#xff0c;这个数组叫做顶点数据(Vertex Data)。 顶点着色…