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

本文主要是介绍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语句造成的代码逻辑复杂,也可以使用策略模式

四、结语

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

这篇关于Java注解Annotation机制说明和基础使用(为什么Annotation直接促进了框架的繁荣发展?)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062373

相关文章

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

python之uv使用详解

《python之uv使用详解》文章介绍uv在Ubuntu上用于Python项目管理,涵盖安装、初始化、依赖管理、运行调试及Docker应用,强调CI中使用--locked确保依赖一致性... 目录安装与更新standalonepip 安装创建php以及初始化项目依赖管理uv run直接在命令行运行pytho

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

Kotlin 枚举类使用举例

《Kotlin枚举类使用举例》枚举类(EnumClasses)是Kotlin中用于定义固定集合值的特殊类,它表示一组命名的常量,每个枚举常量都是该类的单例实例,接下来通过本文给大家介绍Kotl... 目录一、编程枚举类核心概念二、基础语法与特性1. 基本定义2. 带参数的枚举3. 实现接口4. 内置属性三、