注解是框架的底层契约机制,其核心在于理解生命周期(retention)、使用目标(target)及元注解设计意图,并通过反射在编译、运行时串联实现功能。

注解不是语法糖,是框架的底层契约机制。看注解考点,关键不在背@符号,而在理解它如何串联编译、运行和反射三个阶段。
盯住注解的生命周期(Retention)
这是面试必问的起点。@Retention 决定了注解存在的时间:
- @Retention(RetentionPolicy.SOURCE):只在源码阶段有效,编译后就没了,比如 @Override —— 编译器靠它做校验,class 文件里根本找不到
- @Retention(RetentionPolicy.CLASS):保留在 .class 文件中,但运行时无法读取,JVM 加载时不加载它
- @Retention(RetentionPolicy.RUNTIME):唯一能被反射读取的类型,Spring 的 @Autowired、@Controller 都属此类;没这句,框架就“看不见”你的注解
区分注解的使用目标(Target)
同一个注解不能随便乱用,@Target 明确它能标注在哪:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 标在类上(ElementType.TYPE),如 @Service
- 标在方法上(ElementType.METHOD),如 @GetMapping
- 标在参数上(ElementType.PARAMETER),如 @RequestBody
- 标在局部变量或泛型上?默认不允许,必须显式声明,否则编译报错
别忽略元注解的设计意图
自定义注解时,四个元注解不是摆设:
- @Documented:决定该注解是否出现在 JavaDoc 中
- @Inherited:仅对类生效,子类是否自动继承父类的注解(注意:方法不继承)
- @Repeatable:让同一位置能写多个相同注解,比如 @RolesAllowed("ADMIN") @RolesAllowed("USER")
- 组合使用常见套路:@Target({TYPE, METHOD}) + @Retention(RUNTIME) + @Documented 是 Web 层自定义注解的标准配置
结合反射实战才真正掌握
光会写没用,得知道框架怎么用它:
- Spring 启动时扫描所有 @Component 注解的类,靠的是 ClassLoader 加载 class 后,用反射调用 getAnnotations() 获取
- 处理 @Value("${port}") 时,Spring 通过 Field.getAnnotation(Value.class) 拿到表达式字符串,再解析占位符
- 自己写工具类验证参数时,可用 method.getParameterAnnotations() 遍历每个参数上的注解,实现统一校验逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










