一篇文章,系统性聊聊Java注解

你好!

这类系统性聊聊***知识点的文章,是希望给大家带来对某个技术的全貌认识,如果大家喜欢,后续可以陆续更新此系列

下面,开始今天的分享

在之前,我们已经分享过注解相关的三个面试题,

今天的分享,将系统性地探讨Java注解的概念、类型、应用以及实战示例,帮助你全面理解注解

一、Java注解的基本概念

注解本质上是一种特殊的修饰符,类似于类、方法、变量前的public、private等关键字,但它不直接影响程序的执行逻辑,而是用来为程序元素(如类、方法、字段、参数等)添加元数据。这些元数据可以在编译时、运行时或通过工具进行处理,实现特定的功能增强或行为调整。

一个注解由@符号后跟注解类型名构成,例如@Override、@Deprecated等。注解可以接受参数,通过括号内的键值对或无参列表形式指定。例如:

public @interface MyAnnotation {String value() default "default_value";int id();
}@MyAnnotation(value = "myValue", id = 123)
public class MyClass {}

二、Java注解的类型

Java注解根据其生命周期可分为三大类:

  1. 源码注解(Source Code Annotations):这类注解只存在于源代码阶段,编译器在编译时对其进行处理,但不会包含在编译后的字节码中。例如@Override、@SuppressWarnings等,它们主要用于辅助编译器进行错误检查和警告提示。
  2. 编译时注解(Compile-Time Annotations):这类注解在编译时被编译器或其他工具(如APT,Annotation Processing Tool)处理,并可能生成额外的源代码或字节码。例如使用Lombok库时的@Data、@Builder等注解,它们简化了代码编写,实现了自动化的getter/setter、构造器、equals/hashCode等方法生成。
  3. 运行时注解(Runtime Annotations):这类注解在编译后仍保留在字节码中,可以在运行时通过反射机制访问和处理。例如Spring框架中的@Component、@Autowired等注解,它们用于实现依赖注入、切面编程等功能。

三、Java注解的应用场景

注解在Java开发中的应用场景广泛,以下列举几个典型例子:

  1. 编译检查与辅助:如@Override用于验证重写方法的正确性,@Deprecated标记过时的API,@SuppressWarnings抑制特定类型的编译警告。
  2. 代码生成与构建:如Lombok库利用注解简化对象封装,减少样板代码;构建工具Maven、Gradle通过注解配置项目依赖、插件等信息。
  3. 依赖注入与框架集成:如Spring框架利用注解进行组件扫描、依赖注入、事务管理、AOP编程等,极大地简化了企业级应用的开发。
  4. 测试与监控:如JUnit中的@Test、@Before、@After等注解指导测试执行流程,AspectJ的@Trace、@Profile等注解用于性能监控、日志记录等。
  5. 序列化与持久化:如JPA、Hibernate等ORM框架使用注解(如@Entity、@Id、@GeneratedValue等)描述对象与数据库表的映射关系,简化数据库操作。

四、Java注解实战示例

以Spring框架中的@Service注解为例,展示运行时注解的实际应用。假设我们有一个用户服务接口及其实现类:

public interface UserService {User getUserById(Long id);
}@Service
public class UserServiceImpl implements UserService {// 实现方法...
}

在上述代码中,@Service注解标注在UserServiceImpl类上,表明该类是一个业务服务组件。当Spring容器启动时,会通过类路径扫描发现带有@Service注解的类,并将其作为Bean进行实例化、管理和依赖注入。这样,在其他需要使用UserService的地方,只需通过@Autowired注解即可轻松获取到服务实例,无需手动创建和管理对象,大大提高了代码的可维护性和可测试性。

@Controller
public class UserController {@Autowiredprivate UserService userService;// 使用userService...
}

除此之外,大家还可以通过之前分享的文章进行补充

Java中如何实现自定义注解?

也欢迎加入我的知识星球!有三天免费体验期!

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

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

相关文章

【数据结构】单链表和双链表的基操实现

文章目录 一、链表的概念及结构二、链表的分类三、无头单向非循环链表1.单链表创建2.尾插和头插3.尾删和头删4.打印5.查找6.插入7.删除8.销毁 四、带头双向循环链表1.双链表的创建2.初始化3.判断链表是否为空4.尾插和头插5.尾删和头删6.查找7.插入8.删除9.销毁 五、总结链表和顺…

多选择性更容易理解!基于可选择性遗传算法的微电网经济-低碳协调优化程序代码!

前言 随着能源危机和环境污染日益严重,传的能源已不再满足人们日益增长的能源需求,丰富清洁的可再生能源是未来的发展方向,分布式可再生能源发电技术获得了飞速进步。然而,在引入分布式可再生电源后,微电网的复杂性以…

HAL PWM 配置 占空比 频率 stm32 学习笔记

title: HALPWM配置占空比频率 tags: STM32ClionHal 1.STM32CubeMX学习笔记(13)——PWM输出(呼吸灯)使用 2.STM32标准库HAL库 | 高精度动态调节PWM输出频率占空比 看你cubemx 里面的配置时钟频率是多少 参照第二篇文章描述修改 下面俩个参数就行 uin…

【driver4】锁,错误码,休眠唤醒,中断,虚拟内存,tasklet

文章目录 1.互斥锁和自旋锁选择:自旋锁(开销少)的自旋时间和被锁住的代码执行时间成正比关系2.linux错误码:64位系统内核空间最后一页地址为0xfffffffffffff000~0xffffffffffffffff,这段地址是被保留的,如果…

2.5W字 一文读懂汽车智能座舱的FLASH 存储市场、技术

吃瓜群众:机哥,存储是什么玩意,我买手机、电脑的时候导购员都说买内存大的,三星的好,品牌大,问题少,我也只有看哪个内存大就买那个。 机哥:额,这个嘛,说来话长…

Java注解介绍

注解(Annotation)是Java提供的一种元数据形式,它可以被添加到Java代码的各种元素上,如类、方法、变量、参数等。注解的作用主要包括: 1. 代码文档:注解可以用于生成文档,提高代码的可读性。 2.…

概率论 科普

符号优先级 概率公式中一共有三种符号:分号 ; 、逗号 , 、竖线 | 。 ; 分号代表前后是两类东西,以概率P(x;θ)为例,分号前面是x样本,分号后边是模型参数。分号前的 表示的是这个式子用来预测分布的随机变量x,分号后的…

Java-(乘法表之后)增强for循环

这里我们先做个了解,之后我会在数组中进行详细介绍Java5引入了一种主要用于数组或集合的增强型for循环Java增强型for循环语法格式如下 For(声明语句:表达式){ //代码语句 } 声明语句:声明新的局部变量,该变量的类型…

Xinlinx FPGA如何降低Block RAM的功耗

FPGA中降低Block RAM的功耗有两种方式,分别是选择合适的写操作模式以及Block RAM的实现算法及综合设置。我们知道对于采用IP核生成对应的RAM时,会有最小面积算法、低功耗算法以及固定原语,但是采用最小功耗算法有时由于级联长度导致无法实现&…

(论文阅读-优化器)Selectivity Estimation using Probabilistic Models

目录 摘要 一、简介 二、单表估计 2.1 条件独立Condition Independence 2.2 贝叶斯网络Bayesian Networks 2.3 查询评估中的贝叶斯网络 三、Join选择性估计 3.1 两表Join 3.2 概率关系模型 3.3 使用PRMs的选择性估计 四、PRM构建 4.1 评分标准 4.2 参数估计 4.3 结…

MyCat安装

MyCat安装 官网下载地址打不开说明采用站点的方式进行下载基础包 :程序包: 配置原型库数据源root.user.json 配置文件说明(默认配置) Mycat启动授权启动mycat启动mycat查看mycat日志连接Mycat 官网下载地址打不开说明 官网可能受…

workminer之dht通信部分

workminer是通过SSH爆破传播的挖矿木马,感染后会释放xmrig挖矿程序利用主机的CPU挖取北方门罗币。该样本能够执行特定的指令,指令保存在一个配置文件config中,config文件类似于xml文件,里面有要执行的指令和参数,样本中…