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

news2024/11/17 14:25:02

文章目录

    • 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.coloradmin.cn/o/1501496.html

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

相关文章

FFmpeg教程(干货快速上手)

什么是FFmpeg&#xff1f; FFmpeg是一款免费、开源的跨平台多媒体处理工具&#xff0c;它支持几乎所有的视频格式和编码标准。FFmpeg包含了一系列的子项目和工具&#xff0c;如ffmpeg命令行工具用于转码和处理视频和音频文件&#xff0c;ffplay用于播放多媒体内容&#xff0c;…

​谷歌seo外链服务哪家好?

首先你要知道的&#xff0c;就是外链能起到的作用&#xff0c;不是说工具查一查外链数有增加就可以的&#xff0c;外链最重要的作用就是提升关键词排名&#xff0c;发的外链没有效果是没有任何意义的&#xff0c;而且外链基本上是一次性服务&#xff0c;服务完了没有效果完全就…

知识管理系统原来搭建起来这么简单,秘诀在这!

随着信息技术的发展&#xff0c;知识管理系统已经成为组织和团队必不可少的一部分&#xff0c;它可以帮助我们收集、组织和共享知识信息&#xff0c;提升工作效率。然而&#xff0c;搭建一套好的知识管理系统并不会一帆风顺&#xff0c;但放心&#xff0c;我们有简单易行的建设…

2024年最强云桌面科普来啦

云桌面&#xff08;Cloud Desktop&#xff09;是一种最终用户计算方法&#xff0c;它将虚拟桌面和应用程序托管在基于云的资源上&#xff0c;而不是传统的本地企业数据中心资源上。这使得用户只需通过互联网连接&#xff0c;就能够从任何地方、任何设备访问云桌面。云桌面也被称…

升级Xcode 15-全程绿灯+高速公路

还没升级Xcode15的兄弟们&#xff0c;恭喜你们&#xff0c;看完这篇文章&#xff0c;让你的升级Xcode15 之路畅通无阻外加全程高速&#x1f60e;。 前提 系统要求&#xff1a;MacOS 13.5 或更高版本 系统没达到要求的兄弟&#xff0c;先下载好系统升级包&#xff0c;下载好了…

夏朝历史及商周更替

首先我们要知道&#xff0c;为什么我们历史书上把石器时代的几千年叫做三皇五帝时期&#xff0c;而夏启开始我们叫做夏朝呢&#xff1f;那是因为夏朝开始跟原来有几个不一样的特征&#xff0c;第一是父传子家天下&#xff0c;正式确定部落或者方国&#xff08;甲骨文国字就是拿…

C++学习笔记:AVL树

AVL树 什么是AVL树?AVL树节点的定义AVL树的插入平衡因子调整旋转调整左旋转右旋转左右双旋右左双旋 AVL树完整代码实现 什么是AVL树? AVL是1962年,两位俄罗斯数学家G.M.Adelson-Velskii和E.M.Landis 为了解决如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找…

河北省国际光伏展览会

能源是国民经济发展的重要基础之一。随着国民经济的发展&#xff0c;能源的缺口增大&#xff0c;能源安全及能源在国民经济中的地位越显突出。我国是世界上少数几个能源结构以煤为INVITATION主的国家之一&#xff0c;也是世界上最大的煤炭消费国&#xff0c;燃煤造成的环境污染…

鸿蒙系统:揭秘前端开发的新机遇

众所周知&#xff0c;华为开发者大会2023&#xff0c;宣布不再兼容安卓&#xff0c;同时宣布了“鸿飞计划”&#xff0c;欲与iOS、安卓在市场三分天下&#xff0c;这对中国国产操作系统而言&#xff0c;具有划时代的意义。 鸿蒙应用开发的兴起&发展 鸿蒙操作系统是华为自…

力扣102. 二叉树的层序遍历

Problem: 102. 二叉树的层序遍历 文章目录 题目描述思路复杂度Code 题目描述 思路 直接套用树的层序遍历模板&#xff0c;同时将每一层的节点存入一个数组中&#xff0c;并将其存入最终的二维结果数组中 复杂度 时间复杂度: O ( n ) O(n) O(n)&#xff1b;其中 n n n为树节点的…

基于Vue的体育汇App设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 核心技术的理论与分析 3 1.1 客户端技术 3 1.1.1 Vue.js框架 3 1.1.2 Vue.js路由管理 3 1.1.3 Vuex状态管理 3 1.1.4 MVVM开发模式 4 1.1.5 Vant组件库 5 1.2 服务端技术 5 1.2.1 Node.js 5 1.2.2 Egg.js框架 5 1.3 数据库技术 6 1.4 本章…

牛客网——美团2024届秋招笔试第三场编程真题

牛客网——美团2024届秋招笔试第三场编程真题 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题1. 平均数为k的最长连续子数组2. 小球投盒3. 小红结账4. 小美的游戏5. 小美种果树6…

并查集(蓝桥杯 C++ 题目 代码 注解)

目录 介绍&#xff1a; 模板&#xff1a; 题目一&#xff08;合根植物&#xff09;&#xff1a; 代码&#xff1a; 题目二&#xff08;蓝桥幼儿园&#xff09;&#xff1a; 代码&#xff1a; 题目三&#xff08;小猪存钱罐&#xff09;&#xff1a; 代码&#xff1a; …

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

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

应用内存分析

adb shell cat /proc/meminfo 命令&#xff0c;查看剩余的空间还有多少&#xff0c;通常的系统剩余空间是: MemFree cached 1.衡量标准参数 VSS(Virtual set Size)&#xff1a;虚拟内存耗用&#xff08;包括共享库占用的内存&#xff09; RSS(Resident set Size)&#xff1…

js判断页面是否是在iframe里面

文章目录 一、前言1.1、_blank跳转1.2、_self跳转 二、方法2.1、判断子项目是否是在iframe内部2.2、实现_self跳转 三、最后 一、前言 上面是父前端项目里的iframe加载了子前端项目的页面。此时如果点击子项目的内容&#xff0c;如果要进行父项目浏览器页面跳转&#xff0c;可以…

社区医院智慧管理:Java+SpringBoot新实践

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

斐讯N1 刷coreelec 笔记

1.下载恩山的镜像 下载好后不需要刷优盘 这个很方便&#xff0c;可以勾选擦除flash &#xff08;如果第一次装&#xff09; 升级可以不用勾选 详细使用参考恩山大佬的描述 2.下载插件 想装openwrt 发现镜像里面 coreelec-addons 挂了&#xff0c;研究了好长时间可以 去githu…

智慧城市中的数字孪生:构建城市管理的未来框架

目录 一、引言 二、数字孪生技术概述 三、数字孪生技术在智慧城市中的应用 1、实时监测与预警 2、模拟与优化 3、智能化决策 4、协同与共享 四、数字孪生技术构建城市管理的未来框架的价值 1、提高管理效率 2、优化资源配置 3、提升公共服务水平 4、增强应对突发事…

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

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