当前位置: 首页 > news >正文

【注解小结】

1. 什么是注解?

注解(Annotation) 是一种为代码添加**元数据(Metadata)**的机制,它本身不会直接影响程序的逻辑,而是为编译器、框架或运行时环境提供额外的信息。
类比:类似于标签,贴在代码上,告诉工具或框架如何处理这段代码。
示例

@Override  // 标记方法为重写父类方法
public String toString() { ... }

2. 为什么产生注解?

注解的产生主要为了解决以下问题:

  1. 替代冗余的配置文件
    • 传统框架(如Spring、Hibernate)依赖XML配置,注解(如@Component@Entity)直接嵌入代码,减少配置维护成本。
  2. 增强代码可读性
    • 显式标记代码意图(如@Test表示测试方法),比隐式约定更直观。
  3. 支持编译时检查与代码生成
    • 如@Override确保正确重写,Lombok的@Data自动生成getter/setter。
  4. 赋能框架动态行为
    • 运行时通过反射读取注解(如Spring的@Autowired实现依赖注入)。
  5. 统一工具链的元数据标准
    • 如Swagger用@ApiModel生成API文档,替代手动维护文档。

3. 注解的组成元素

以Java为例,注解的组成包括:

(1)注解声明

通过@interface定义注解,可包含属性和默认值。

public @interface MyAnnotation {
    String value() default "";  // 属性
    int priority() default 0;   // 带默认值的属性
}

(2)元注解(Meta-Annotation)

用于修饰注解本身的注解,控制注解的行为:
@Target:指定注解可应用的目标(类、方法、字段等)。

@Target(ElementType.METHOD)  // 只能用在方法上
public @interface Test { ... }

@Retention:定义注解的生命周期(源码、编译时、运行时)。

@Retention(RetentionPolicy.RUNTIME)  // 运行时保留
public @interface Autowired { ... }

@Documented:是否将注解包含在Javadoc中。
@Inherited:是否允许子类继承父类的注解。

(3)注解属性

注解可以包含可配置的属性(类似方法的无参形式):

@MyAnnotation(value = "hello", priority = 1)
public class Demo { ... }

4. 注解的作用

作用示例应用场景
编译时检查@Override@NonNull防止编码错误,增强类型安全。
代码生成Lombok的@Data自动生成getter/setter/构造函数。
运行时框架支持Spring的@Controller、JPA的@Entity依赖注入、事务管理、ORM映射。
配置替代@RequestMapping("/api")替代XML配置,简化开发。
文档生成Swagger的@ApiOperation自动生成API文档。
测试标记JUnit的@Test标识测试方法。

5. 常见注解示例

Java原生注解

@Override      // 重写方法
@Deprecated    // 标记过时方法
@SuppressWarnings("unchecked")  // 忽略警告

框架注解

@SpringBootApplication  // Spring Boot启动类
@GetMapping("/user")    // Spring MVC路由
@Entity                 // JPA实体类

工具注解

@Data                   // Lombok自动生成getter/setter
@Builder                // 生成建造者模式代码

总结

注解是什么:代码的元数据标签。
为什么需要:简化配置、增强可读性、支持工具链集成。
组成元素:注解声明、元注解、属性。
核心作用:编译检查、代码生成、框架集成、文档生成等。

注解是现代编程中声明式开发的核心工具,极大提升了开发效率和代码可维护性。

http://www.dtcms.com/a/115523.html

相关文章:

  • ST 芯片架构全景速览:MCU、无线 SoC、BLE 模块、MPU 差异详解
  • MyBatis 分页插件使用教程
  • 常用数据时域降噪方法
  • 嵌入式自动化测试
  • P3799 小 Y 拼木棒
  • 内网渗透-Linux提权之suid提权
  • 论文精读:NC CoNb3S6拓扑能斯特效应 附Peer Review
  • L2-050 懂蛇语(测试点1)
  • 微软推出首款量子计算芯片Majorana 1
  • MySQL中的索引
  • YOLOv11实战电力设备缺陷检测
  • VB.NET Asp.Net Core模板WebAPI应用-宝塔面板Linux系统通过Docker部署
  • 常见的 JavaScript 框架和库
  • OpenDriveVLA:通过大型视觉-语言-动作模型实现端到端自动驾驶
  • Qt Quick 与 Qt 版本匹配关系
  • 前后端开发的未来趋势
  • 内容中台:全域信息协同新引擎
  • RCE漏洞的小点总结
  • 高并发内存池:原理、设计与多线程性能优化实践
  • 【Kubernetes】Kubernetes 如何管理存储?PV 和 PVC 是如何工作的?
  • C++——清明
  • QScrollArea 内部滚动条 QSS 样式失效问题及解决方案
  • JavaScript逆向WebSocket协议解析与动态数据抓取
  • 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter11-实践:基于onnxruntime的手写数字识别库
  • LENOVO联想ThinkBook 16 G6 ABP(21KK)恢复预装OEM原厂Win11系统镜像
  • 每日c/c++题 备战蓝桥杯(小球反弹)[镜像思路求解,最小公倍数]
  • 为什么 LoRA 梯度是建立在全量参数 W 的梯度之上
  • 面向对象编程(OOP)概述
  • 低延迟云网络的核心技术
  • OpenCV轮廓检测全面解析:从基础到高级应用