【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.mzph.cn/news/730935.shtml

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

相关文章

基于工业边缘网关的机械状态监测与故障诊断应用

机械设备工作于各种各样的环境&#xff0c;在运行过程中必然受到力、温度、摩擦等多种物理、化学作用,使机械设备状态和性能变化,进而产生“隐性故障”。随着机械设备“隐性故障”的长期累积&#xff0c;可能造成设备损伤损坏&#xff0c;甚至影响系统整体生产和运营&#xff0…

从零开始学习Diffusion Models: Sharon Zhou

How Diffusion Models Work 本文是 https://www.deeplearning.ai/short-courses/how-diffusion-models-work/ 这门课程的学习笔记。 文章目录 How Diffusion Models WorkWhat you’ll learn in this course [1] Intuition[2] SamplingSetting Things UpSamplingDemonstrate i…

帮管客 CRM jiliyu SQL注入漏洞复现

0x01 产品简介 帮管客CRM是一款集客户档案、销售记录、业务往来等功能于一体的客户管理系统。帮管客CRM客户管理系统,客户管理,从未如此简单,一个平台满足企业全方位的销售跟进、智能化服务管理、高效的沟通协同、图表化数据分析帮管客颠覆传统,重新定义企业管理系统。 …

乐得瑞的一拖二100W智能分配方案更加成熟

在快节奏的现代生活中&#xff0c;手机不仅是通讯工具&#xff0c;更是我们工作、学习和娱乐的得力助手。然而&#xff0c;手机的电量问题一直是困扰我们的难题。为了解决这一问题&#xff0c;市场上应运而生了一种名为“一拖二快充线”的充电设备。它集快速充电与独特设计于一…

ADS功分器模型含义

ADS功分器模型含义 文章目录 ADS功分器模型含义dbpolar和单个值polar和单个值polar和dbpolar单个值 S21和S31传输系数 S11和S22反射系数 Isolation 隔离度 Zref 端口的参考阻抗&#xff0c;默认为50Ω CheckPassivity 检查是否无源&#xff0c;默认是无源器件 目前根据仿真结…

Shopify支持哪些付款方式 Shopify绑定信用卡教程

一、Shopify 信用卡和借记卡支付&#xff1a;Shopify支持Visa、Mastercard、American Express等国际信用卡和借记卡付款。卖家可以通过选择Fomepay的447420来付款 二、Shopify绑定信用卡教程 要在Shopify上绑定国内信用卡&#xff0c;需要进行以下步骤。 1、办理一张visa信…

Kafka MQ 生产者和消费者

Kafka MQ 生产者和消费者 Kafka 的客户端就是 Kafka 系统的用户&#xff0c;它们被分为两种基本类型:生产者和消费者。除 此之外&#xff0c;还有其他高级客户端 API——用于数据集成的 Kafka Connect API 和用于流式处理 的 Kafka Streams。这些高级客户端 API 使用生产者和消…

【Java】生成条形码工具类

报销单需要根据单号生成条形码 先看效果图 直接上代码&#xff0c;复制即可使用 /*** Description:生成条形码*/ public class BarCodeUtils {/*** 默认图片宽度*/private static final int DEFAULT_PICTURE_WIDTH 300;/*** 默认图片高度*/private static final int DEFAULT_…

一起来读李清照

当然先祝各位女生节日快乐&#x1f381;&#x1f381;啦​。​ 但是呢&#xff0c;今天&#xff0c;我们不聊技术&#xff0c;来聊点其他的。 大家都知道今天是三八妇女节&#xff0c;三八妇女节的是中国人的叫法&#xff0c;也叫国际妇女节。是为了纪念妇女权利的运动&#…

基于禁忌搜索算法(TS)的TSP(Python实现)

本篇文章是博主在最化优学习、人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在最优化算…

springboot248校园资产管理

校园资产管理 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园资产管理就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大…

CDN(内容分发网络):加速网站加载与优化用户体验

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

java——2024-03-03

String类的对象能被修改吗&#xff1f;如果不能需要用什么修改&#xff1f;StringBuilder和StringBuffer的区别&#xff1f;equals和区别谈谈对面向对象的理解重载和重写的区别说一下ArrayList&#xff0c;LinkedList底层实现以及区别什么是哈希冲突&#xff1f;hashMap和conCu…

mysql 8.0 日志文件无权限问题处理

无论如何修改权限总是报这个日志文件权限问题。 解决方法 输入指令&#xff1a; setenforce 0 systemctl restart mysgld

LVS集群(Linux Virtual server)介绍----及LVS的NAT模式部署(一)

群集的含义 ●Cluster&#xff0c;集群、群集由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供访问入口(域名或IP地址)&#xff0c;相当于一台大型计算机 问题&#xff1a; 互联网应用中&#xff0c;随着站点对硬件性能、响应速度、服务稳定性、数据可靠…

Java开发从入门到精通(一):JavaJava的基础语法知识高阶

Java大数据开发和安全开发 &#xff08;一&#xff09;Java的数组1.1 静态初始化数组1.1.1 静态数组的定义1.1.2 数组的原理1.1.3 数组的访问1.1.3.1 数组的取值1.1.3.2 数组的赋值1.1.3.3 数组的长度1.1.3.4 数组的使用 1.1.4 数组的遍历1.1.3 数组的案例 1.2 动态初始化数组1…

WanAndroid(鸿蒙版)开发的第一篇

前言 DevEco Studio版本&#xff1a;4.0.0.600 WanAndroid的API链接&#xff1a;玩Android 开放API-玩Android - wanandroid.com 为了兼容HarmonyOS&#xff0c;我这边以Arkts--API9为例进行实现 通过华为官网渠道目前下载的版本还是3.1的&#xff0c;这边提供下4.0版本下载…

从2个角度来简单讨论一下伦敦金走势图怎么看

进入伦敦金市场之后&#xff0c;投资者无时无刻都在思考着一个问题&#xff0c;那就是伦敦金走势怎么看&#xff1f;关于这个问题&#xff0c;其实在市场中有很多的文章和视频去介绍&#xff0c;在书店里也有很多投资前贤所写的书籍讨论过这个问题。但是他们都有一个特征&#…

【SpringMVC】快速体验 SpringMVC接收数据 第一期

文章目录 一、SpringMVC 介绍1.1 主要作用1.2 核心组件和调用流程理解 二、快速体验三、SpringMVC接收数据3.1 访问路径设置3.1.1 精准路径匹配3.1.2 模糊路径匹配3.1.3 类和方法级别区别3.1.4 附带请求方式限制3.1.5 进阶注解 与 常见配置问题 3.2 接收参数&#xff08;重点&a…

复杂业务场景下,如何优雅的使用设计模式来优化代码?

1、引言 本文以一个实际案例来介绍在解决业务需求的路上&#xff0c;如何通过常用的设计模式来逐级优化我们的代码&#xff0c;以把我们所了解的到设计模式真实的应用于实战。 2、背景 假定我们现在有一个订单流程管理系统&#xff0c;这个系统对于用户发起的一笔订单&#…