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

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

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

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.mzph.cn/pingmian/27750.shtml

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

相关文章

分布式微服务: springboot底层机制实现

springboot底层机制实现 搭建SpringBoot底层机制开发环境ConfigurationBean会发生什么,并分析机制提出问题: SpringBoot 是怎么启动Tomcat, 并可以支持访问Controller源码分析: SpringApplication.run()SpringBoot的debug流程 实现SpringBoot底层机制[Tomcat启动分析 Spring容…

【数据分析】推断统计学及Python实现

各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

数列求和、统计输入正数个数 题目

题目 JAVA9 数列求和分析:代码:大佬代码: JAVA10 统计输入正数个数分析:代码: JAVA9 数列求和 描述 有数列为:9,99,999,…,9999999999。要求使用程序计算此数…

【SpringBoot】SpringBoot:实现文件上传和下载功能

文章目录 引言项目初始化添加依赖 配置文件存储位置实现文件上传功能创建文件上传控制器创建上传页面 实现文件下载功能创建文件下载控制器 安全性和最佳实践文件大小限制文件类型验证文件名和路径验证文件下载时的安全性 测试与部署示例:编写单元测试 部署结论 引言…

墨香戏韵,重塑经典

创意名称 墨香戏韵,重塑经典|基于AIGC对戏剧创新 创意概述 京剧作为中国传统戏曲之一,源远流长,承载了丰富的文化内涵和艺术特色。水墨画则是中国传统绘画的瑰宝,以其独特的墨色表达和极简的形式赢得了广泛的赞誉。我们的项目将…

Nacos入门与实践

将 Nacos 集成到 Spring Cloud 项目中,可以实现服务发现和配置管理。以下是一个详细的入门指南,包括如何设置 Nacos 服务器,创建 Spring Cloud 项目,进行服务发现和配置管理。 1. 环境准备 首先,确保你已经安装了以下…

docker-compose部署FastDFS分布式文件系统

文章目录 一、技术选型二、fastDFS组成部分三、docker-compose文件四、客户端nginx配置五、存储器spring Boot集成参考文献 一、技术选型 还有一个更好的google FS(但是他不开源,我也没找到社区版一类的可以不要钱使用的)。 最后考虑到我们存…

MySQL每日备份

每天备份一次mysql数据库,备份最近7天的. 要在Linux中编写脚本来每天备份MySQL数据库并只保留最近7天的备份,你可以按照以下步骤操作: 第一步:创建备份脚本 打开终端 并使用你喜欢的文本编辑器创建一个新脚本文件,例如使用 : vim…

【字符串函数2】

5. strncpy 函数的使用和模拟实现 选择性拷贝 char * strncpy ( char * destination, const char * source, size_t num ); 1.拷贝num个字符从源字符串到目标空间。 2.如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边 追加0 &#…

MatLab中无穷量和非数值量

文章目录 MatLab中无穷量和非数值量 MatLab中无穷量和非数值量 MatLab中使用Inf和-Inf表示正无穷量与负无穷量。NaN表示非数值量。Inf与-Inf一般由于运算溢出导致超出双精度浮点数类型能够表示数值范围产生。NaN则是由于非正常运算而产生的。如0/0或者Inf/Inf。

语法04 C++ 标准输入语句

标准输入 使用格式:cin >> 输入的意思就是把一个值放到变量里面去,也就是变量的赋值,这个值是由我们自己输入的。 (注意:输入变量前要先定义,输入完之后要按Enter键。) 输入多个变量,与输出类似,…

C++中的转义字符问题

C中的转义字符问题 有些字符不能直接通过键盘输入到程序中。例如,按回车键并不能使字符串包含一个换行符;相反,程序编辑器将把这种键击解释为在源代码中开始新的一行。其他一些字符也无法从键盘输入,因为 C语言赋予了它们特殊的含义。例如&a…

unity数独游戏

using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class MainMenuPanel : MonoBehaviour {public Button btnPlay; // 开始按钮public Slider sldDifficulty; // 难度滑动条private void Awake(){/…

springer 在线投稿编译踩坑

springer投稿,在线编译踩坑总结 注意: 有的期刊需要双栏,而预定义的模板中可能为单栏,需要增加iicol选项。 例如: \documentclass[sn-mathphys-num]{sn-jnl}% —>\documentclass[sn-mathphys-num, iicol]{sn-jnl}…

Matlab的Simulink系统仿真(simulink调用m函数)

这几天要用Simulink做一个小东西,所以在网上现学现卖,加油! 起初的入门是看这篇文章MATLAB 之 Simulink 操作基础和系统仿真模型的建立_matlab仿真模型搭建-CSDN博客 写的很不错 后面我想在simulink中调用m文件 在 Simulink 中调用 MATLA…

远程问诊软件哪款好?选欣九康诊疗系统

近几年国家相继推出了支持发展“互联网医疗”的政策,如今随着相关政策的不断落实推进,市场上涌现出了一大批在线咨询、电子处方和远程问诊的医疗平台,而在面对种类如此繁多的医疗平台究竟选择哪款更好便成了医疗机构非常头疼的事情&#xff0…

【分形技术在神经网络建模中的应用】

分形技术在神经网络建模中的应用 随着大数据时代的到来,神经网络的应用越来越广泛。神经网络的优势在于其能通过学习的方式将任务的模式记忆下来并预测未知的数据。然而,神经网络的主要缺点是需要大量的训练数据和计算资源,这使得它难以解决…

Dubbo 3.x源码(22)—Dubbo服务引用源码(5)服务引用bean的获取以及懒加载原理

基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo3.1版本的服务引入的总体流程,当然真正的服务远程引入、以及配置迁移啥的都还没讲,但是本次我们先不接着讲MigrationRuleListener#onRefer方法,而是先…

数据中心布线管理:预标记线缆与移动扫描技术的融合

随着信息技术的飞速发展,数据中心布线管理面临着前所未有的挑战。传统的布线管理方式已无法满足现代数据中心高效、准确和可靠的需求。在这样一个背景下,预标记线缆与移动扫描技术的结合,为数据中心布线管理带来了革命性的解决方案。 布线管理…

港理工最新综述:基于LLM的text-to-SQL调查(方法实验数据全面梳理)1

【摘要】文本到SQL旨在将自然语言问题转换为可执行的SQL语句,这对用户提问理解、数据库模式理解和SQL生成都是一个长期存在的挑战。传统的文本到SQL系统包括人工工程和深度神经网络。随后,预训练语言模型(PLMs)被开发并用于文本到SQL任务,取得了可喜的成绩。随着现代数据库变得…