151
社区成员
发帖
与我相关
我的任务
分享注解是 Java 从 JDK 5 开始引入的一种元数据机制,它本身不直接执行逻辑,却能为代码提供额外信息,被编译器、框架或运行时读取并使用。如今几乎所有主流 Java 框架都基于注解实现,是现代 Java 开发中必不可少的核心知识点。
一、什么是注解
注解可以理解为给代码贴的“标签”。
它不影响程序的正常运行,但可以被工具或框架识别,用来实现配置、校验、增强、自动注入等功能。
常见如 @Override、@Test、@Autowired、@RequestMapping 都是注解。
二、注解的作用
1. 编译期检查
让编译器提前发现错误,如 @Override 检查方法重写是否正确。
2. 替代配置文件
框架中用注解代替 XML,代码更简洁,如 Spring 中的 @Service、@Controller。
3. 运行时逻辑增强
结合反射实现自动注入、事务管理、权限校验、日志记录等。
4. 代码生成
编译时生成代码,如 Lombok 的 @Data 自动生成 getter/setter。
三、Java 内置标准注解
1. @Override
检查方法是否正确重写父类或接口方法。
2. @Deprecated
标记方法已过时,不推荐使用。
3. @SuppressWarnings
压制编译器警告。
4. @FunctionalInterface
标记函数式接口,确保只有一个抽象方法。
四、元注解(注解的注解)
元注解用于定义自定义注解,Java 提供 4 个核心元注解:
1. @Target
指定注解能用在哪里(类、方法、字段、参数等)。
2. @Retention
指定注解生命周期:
◦ SOURCE:仅源码
◦ CLASS:保留到字节码
◦ RUNTIME:运行时可通过反射读取(最常用)
3. @Documented
生成 Javadoc 时包含该注解。
4. @Inherited
子类可以继承父类的该注解。
五、自定义注解示例
简单定义一个注解,用于标记方法功能:
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo {
String author() default "unknown";
String date();
}
使用:
public class Test {
@MethodInfo(author = "张三", date = "2026-04-29")
public void test() {
System.out.println("测试方法");
}
}
六、注解与反射结合使用
运行时读取注解是框架实现自动配置的核心原理:
Method method = Test.class.getMethod("test");
MethodInfo anno = method.getAnnotation(MethodInfo.class);
System.out.println(anno.author());
System.out.println(anno.date());
这就是 Spring、SpringBoot、MyBatis、JUnit 等框架的底层实现方式。
七、注解在实际开发中的应用
• Spring:@Component、@Autowired、@Configuration
• SpringBoot:@SpringBootApplication、@RestController
• MyBatis:@Mapper、@Select
• Lombok:@Data、@NoArgsConstructor、@AllArgsConstructor
• 校验:@NotNull、@NotBlank
八、总结
注解是 Java 实现简化配置、框架自动化、代码增强的关键机制。它让配置与代码合一,极大提升开发效率。
理解注解的定义、生命周期、元注解以及与反射的配合,是看懂框架源码、写出优雅 Java 代码的必备基础,也是面试高频考点。