注解
2025/11/30大约 2 分钟
注解
@Data
Data 注解
@Data
是 Lombok 提供的组合注解
等价于同时加上:
@Getter —— 生成所有字段的 getter
@Setter —— 生成所有字段的 setter
@ToString —— 生成 toString()
@EqualsAndHashCode —— 生成 equals() 和 hashCode()
@RequiredArgsConstructor —— 生成包含 final 字段 和 @NonNull 字段的构造器
@NotBlank
@NotBlank 是 Java 校验注解中最严格、最常用的一个,专门用于处理字符串 (String) 类型的字段。
一句话概括:它要求字符串既不能是 null,也不能是空字符串 "",更不能全是空格 " "。
@Data
public class LoginDTO {
/**
* 用户名
*/
@NotBlank(message = "用户名不能为空")
private String username;
/**
* 密码
*/
@NotBlank(message = "密码不能为空")
private String password;
}@Valid
它的作用是:告诉 Spring 框架,“请现在、立刻、马上检查这坨数据是否符合规则,如果不符合,直接报错,别往下执行了”。
这是 95% 的使用场景。通常用在 @RequestBody 接收 JSON 数据的时候。
public R<LoginVO> login(@Valid @RequestBody LoginDTO loginDTO) {
LoginVO loginVO = authService.login(loginDTO);
return R.ok(loginVO);
}@Autowired @Resource @RequiredArgsConstructor
这三个注解都是用来实现依赖注入的,但来源、匹配规则和推荐程度各不相同。
快速对比表
| 特性 | @Autowired | @Resource | @RequiredArgsConstructor |
|---|---|---|---|
| 来源 | Spring 框架 | JDK (JSR-250) | Lombok |
| 注入方式 | 字段/Setter/构造器 | 字段/Setter | 构造器 |
| 匹配规则 | 先按类型,再按名称 | 先按名称,再按类型 | 按类型(构造器注入) |
| 是否需要写代码 | 需要加注解 | 需要加注解 | 只需声明 final 字段 |
| 推荐程度 | ⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ |
@Autowired(Spring 原生)
@Service
public class UserService {
@Autowired // 字段注入,不推荐
private UserMapper userMapper;
}特点:
- 默认按类型 (byType) 匹配,找到多个同类型 Bean 时报错
- 可配合
@Qualifier("beanName")指定具体 Bean - 字段注入方式无法用于 final 字段,不利于单元测试
@Resource(JDK 标准)
@Service
public class UserService {
@Resource(name = "userMapper") // 按名称注入
private UserMapper userMapper;
}特点:
- 默认按名称 (byName) 匹配,名称找不到再按类型
- 属于 JDK 标准注解,不依赖 Spring
- 同样是字段注入,存在与 @Autowired 相同的问题
@RequiredArgsConstructor(Lombok,推荐 ✅)
@Service
@RequiredArgsConstructor // Lombok 自动生成构造器
public class UserService {
private final UserMapper userMapper; // final 字段自动注入
private final OrderMapper orderMapper;
// Lombok 自动生成:
// public UserService(UserMapper userMapper, OrderMapper orderMapper) {
// this.userMapper = userMapper;
// this.orderMapper = orderMapper;
// }
}特点:
- 自动为所有
final字段生成构造器 - 构造器注入是 Spring 官方推荐的方式
- 字段不可变(final),更安全
- 方便单元测试(可直接 new 传入 Mock 对象)
- 代码最简洁
总结
[!TIP] > 日常开发强烈推荐使用
@RequiredArgsConstructor只需两步:
- 类上加
@RequiredArgsConstructor- 需要注入的字段声明为
private final
