Java 注解生命周期简图
三类保留策略:SOURCE / CLASS / RUNTIME

分层对照表
| 保留策略 | RetentionPolicy | 代表注解 | IDE 能读到 | class 里存在 | 运行时反射可读 |
|---|---|---|---|---|---|
| SOURCE | 源码级 | @Nullable(Spring)、//注释 |
✅ 可以 | ❌ 编译后删除 | ❌ 不能 |
| CLASS | 字节码级 | 部分 Lombok 内部注解 | ✅ 可以 | ✅ 存在 | ❌ 默认丢弃 |
| RUNTIME | 运行时级 | @Autowired、@RequestMapping |
✅ 可以 | ✅ 存在 | ✅ 反射拿到 |
关键结论提炼
-
org.springframework.lang.@Nullable只活在 .java 源码 ,编译一出直接消失; 只有 IDEA、Sonar 这类静态工具看得见,Spring 运行时完全看不到。 -
@Autowired这种运行时注解 一路保存到程序运行,Spring 依靠反射解析注解实现依赖注入。
容易混淆两组注解区分
org.springframework.lang.NonNull👉 SOURCE、仅静态提示,不会运行校验jakarta.validation.NotNull(参数校验) 👉 RUNTIME,框架运行时检测,为空直接抛出异常
一个是给开发看的 "约定提醒",一个是线上生效的 "强制校验"。