Java注解Annotation机制说明和基础使用(为什么Annotation直接促进了框架的繁荣发展?)

news2025/6/22 18:07:36

一、注解解决的问题【可忽略】

软件开发过程中,如何配置一直是一个重要的问题,对于一个框架,如果你不为它提供初始结构,它就无法理解你要做什么,自然无法工作。

1.问题:紧密贴合的代码和配置

在很久之前,开发者一般选择在代码段里,添加复杂的配置。
这样做,调试管理就是麻烦的问题。

2.问题:配置文件使得代码结构松散

后来,发展出配置文件来存放配置信息,比如经典的XML、纯文本。
举个例子,Spring框架最初使用XML文件配置Bean。
初学Spring时,想必大家都使用过Spring.xml或者properties.xml文件,来配置bean信息,或者配置数据库信息。
这种行为不仅看起来非常奇怪,初学者根本不能理解为什么配置一个xml文件,竟然能够影响到Spring的运行,还会使代码结构相当松散。
由于配置文件完全独立,在修改配置代码时,对于新加入项目的开发者,无法将配置信息和代码段应,更遑论修改

3.解决方案:注解标注配置信息

大家或多或少,应该都使用过一些注解,有的注解完全没有信息,比如@Component、@Data。
另外一些注解,我们需要配置信息,比如@MapperScan。
类的继承结构中,所有的自定义注解都是继承Annotation接口,当然,想深入理解原因,则需要学习Java语法机制,本文不赘叙。
对于无需信息的注解,其相当于一个标签,标记一个类、方法、属性或者接口,说明这个元素有这个标签,至于如何使用,则需要在编译、运行时依靠反射
对于需要信息的注解,我们同样使用反射机制,拿到注解标注的信息,从而进行相关开发。


分割线


二、注解的基础使用

这一部分,讲解了如何声明注解、如何通过反射得到注解使用注解

1.注解的声明和属性定义

注解的声明,和类、接口的声明非常类似,唯一的区别在于将class字段,改为@interface字段。
在注解中,可以定义一些属性,在Java语法中,这些属性相当于SpringMVC的Data类,只允许有Setter、Getter方法。【不过,注解本身也是为了解决数据配置问题诞生的】
如图所示:声明注解的方法

2.反射得到注解

我们说过,注解的本质是继承了Annotation接口,所以,注解本质上也是一个类(接口),既然是一个类,Java就会使用Class对象管理这个类。
这就是注解使用的前提。
使用Class,实例化某个类的Class对象,然后调用getAnnotations方法,可以得到这个类的所有注解,如下图所示。
拿到注解对象后,我们可以把它当成一个普通的Class对象来处理。
又因为这个类只有属性,并且,由于它是接口,这个属性在第一次赋值后就固定【static】。所以关键在于如何拿到它的属性
对每一个注解的属性,都会有一个与属性名相同的方法,来获得属性的值。【和getter方法类似,不过不用get字段

Class clazz = DataEntity.class;
// 得到所有的注解
Annotation[] annotations = clazz.getAnnotations();
// 得到AnnoReal这一类注解,实际开发中不会这么用
AnnoReal annotation = (AnnoReal) clazz.getAnnotation(AnnoReal.class);

3.使用演示:

// 我在AnnoReal注解类中,定义了value属性
System.out.println(annotation.value());

4.Java反射的核心Field、Method【简明介绍】

  1. name字段名,对于属性、方法来说,都会有字段名来唯一标识它。
  2. 指向对象的类:对于属性,定义它的类。【比如int a,a的Field则指向Integer】
  3. 对于Method:则有返回值类、参数类数组

三、通过方法拿到注解对象,或者拿到所有的注解数组。

clazz.getAnnotations();

实际开发中,因为我们不能确定哪个类实现了哪个注解,我们只能使用大量的if语句,来判断注解类型,从而决定怎么做。
当然,为了避免大量if语句造成的代码逻辑复杂,也可以使用策略模式

四、结语

注解为什么促进了框架发展?因为一个框架的学习需要很高的成本,注解的使用大大降低了理解难度,所以促进了。
我是蚊子码农,如有补充或者疑问,欢迎在评论区留言。个人的知识体系可能没有那么完善,希望各位多多指正,谢谢大家。

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

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

相关文章

One能聊天接入百度千帆AppBuilder

One能聊天介绍:基于ChatGPT实现的微信小程序,适配H5和WEB端。包含前后端,支持打字效果输出流式输出,支持AI聊天次数限制,支持分享增加次数等功能One能聊天开源地址:https://github.com/oldinaction/ChatGPT-MPOne能聊天演示环境:可关注【阿壹族】公众号,并回复【One能聊…

spring框架(SSM)

Spring Framework系统架构 Spring框架是一个开源的企业级Java应用程序框架,它为开发Java应用程序提供了一个全方位的解决方案。Spring的核心优势在于它的分层架构,这使得开发者可以灵活选择使用哪些模块而无需引入不需要的依赖。下面是Spring框架的一些关…

Cisco Packet Tracer实验(三)

续实验二 问题一:使用二层交换机连接的网络需要配置网关吗?为什么? 二层交换机作为网络设备中的一种,主要用于在局域网(LAN)内部进行数据包的转发。它工作在OSI模型的第二层(数据链路层&#xf…

08_基于GAN实现人脸图像超分辨率重建实战_超分辨基础理论

1. 超分辨的概念与应用 我们常说的图像分辨率指的是图像长边像素数与图像短边像素数的乘积,比如iPhoneX手机拍摄照片的分辨率为 4032px3024px,为1200万像素。 显然,越高的分辨率能获得更清晰的成像。与之同时,分辨率越高也意味着更大的存储空间,对于空间非常有限的移动设…

Embedding 模型的选择和微调

构建一个检索增强生成 (Retrieval-Augmented Generation, RAG) 应用的概念验证过程相对简单,但要将其推广到生产环境中则会面临多方面的挑战。 『RAG 高效应用指南』系列将就如何提高 RAG 系统性能进行深入探讨,提供一系列具体的方法和建议。同时读者也需…

StableSwarmUI 安装教程(详细)

文章目录 背景特点安装 背景 StableSwarmUI是StabilityAI官方开源的一个文生图工作流UI,目前处于beta阶段,但主流程是可以跑通的。该UI支持接入ComfyUI、Stable Diffusion-WebUI。其工作原理就是使用ComfyUI、Stable Diffusion-WebUI或者StabilityAI官方…

张艺兴step新专开启自由驾驶新纪元

张艺兴《Step》新专,开启自由驾驶新纪元!当音乐与驾驶相遇,会碰撞出怎样的火花?当实力派艺人张艺兴遇上全新英文专辑《Step》,便为我们解锁了一种前所未有的出行体验!这不仅仅是一张音乐专辑,更…

英伟达GPU对比分析:A100、A800、H100与H800

在当今技术迅速发展的时代,英伟达的GPU产品线提供了多种高性能选项,以满足不同类型的工作负载需求。本文将对英伟达的四种GPU型号——A100、A800、H100和H800进行深入对比分析,探讨它们在性能、架构、应用场景等方面的差异,以帮助…

Redis原理篇——分布式锁

Redis原理篇——分布式锁 分布式锁是什么?分布式锁有哪些特性?分布式锁常用实现方式Redis 实现分布式锁一、简单的 Redis 锁二、带过期时间的 Redis 锁三、加上 Owner 的 Redis 锁四、Lua 脚本确保原子性 分布式锁是什么? 分布式锁是在分布式…

HTML解析之Beautiful Soup

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Beautiful Soup是一个用于从HTML和XML文件中提取数据的Python库。Beautiful Soup 提供一些简单的、函数用来处理导航、搜索、修改分析树等功能。Beau…

YOLOX: 无锚点机制 + 解耦头部设计 + 动态标签分配策略的高性能目标检测器 + Apache-2.0 开源可商用

YOLOX: 无锚点机制 解耦头部设计 动态标签分配策略的高性能目标检测器 Apache-2.0 开源可商用 1. Decoupled Head 解耦头部的使用2. 强化数据增强策略3. 采用无锚点检测机制4. 多正样本策略5. SimOTA标签分配策略6. CSPDarkNet 网络结构DarkNet53 的深度特征提取能力DarkNet…

简单http客户端程序

要求和目的 深入理解http协议以及http下载相关功能的程序设计 实验环境 Java语言,PC平台 实验要求 基本要求:使用Socket类,实现一个简单的HTTP客户端程序。用户输入URL,该程序可以从服务器下载URL指定的资源,并将之…

LabVIEW RT在非NI硬件上的应用与分析

LabVIEW RT(实时操作系统)可运行在非NI(National Instruments)硬件上,如研华工控机,但需要满足特定硬件要求。本文从硬件要求、开发和运行差异、可靠性、稳定性、优势和成本等多角度详细分析在非NI硬件上运…

后端返回前端时间格式化

时间格式化的方法总共包含以下 5 种。 1.前端时间格式化 JS 版时间格式化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 function dateFormat(fmt, date) { let ret; const opt { "Y": date.getFullYear().toString(), // 年 …

挂耳式耳机哪个牌子好性价比高、五大招牌力作精选归纳

如果说你很喜欢户外运动,日常生活中也是需要经常佩戴耳机,那么你一定有了解到耳机是开放式耳机,这类耳机无论在户外运动防水防汗还是在耳朵健康方面都具备它的优点,在市面上是很受欢迎的。 但面对市面上不同品牌的耳机都会显得眼…

【面试干货】深入理解Java中的final关键字

【面试干货】深入理解Java中的final关键字 一、被 final 修饰的类二、被 final 修饰的方法三、被 final 修饰的变量四、被 final 修饰的常量 💖The Begin💖点点关注,收藏不迷路💖 在Java中,final关键字有多种用途&…

组合和外观模式

文章目录 组合模式1.引出组合模式1.院系展示需求2.组合模式基本介绍3.组合模式原理类图4.解决的问题 2.组合模式解决院系展示1.类图2.代码实现1.AbsOrganizationComponent.java 总体抽象类用于存储信息和定义方法2.University.java 第一层,University 可以管理 Coll…

atcoder ABC 355-C题详解

atcoder ABC 355-C题详解 ​ Problem Statement There is an NN grid, where the cell at the i-th row from the top and the j-th column from the left contains the integer N(i−1)j. Over T turns, integers will be announced. On Turn i, the integer Ai​ is anno…

C++入门8 构造函数析构函数顺序|拷贝构造

一&#xff0c;构造函数析构函数 调用顺序 我们先来看下面的代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> using namespace std; class student { public:char my_name[20];int my_id;student(int a) {my_id a;co…

使用超声波麦克风阵列预测数控机床刀具磨损

预测性维护是使用传感器数据来推断机器状态&#xff0c;并从这些传感器数据中检测出在故障发生之前存在的缺陷或故障的过程。预测性维护在所有工业领域都是一种日益增长的趋势&#xff0c;包括轴承故障检测、齿轮磨损检测或往复式机器中的活塞磨损等许多其他例子。在预测性维护…