🚀 一、它是干嘛的?
@RequiredArgsConstructor 是 Lombok 提供的注解,
👉 会自动生成一个包含所有 final 字段的构造方法。
也就是说------只要你把依赖写成 final,Spring Boot 就能自动注入。
再也不用写 @Autowired 或手动构造器啦!
🌱 基础示例:
java
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final MailClient mailClient;
public void register(User user) {
userRepository.save(user);
mailClient.sendWelcome(user);
}
}
等价于:
kotlin
@Service
public class UserService {
private final UserRepository userRepository;
private final MailClient mailClient;
@Autowired
public UserService(UserRepository userRepository, MailClient mailClient) {
this.userRepository = userRepository;
this.mailClient = mailClient;
}
}
👉 少了 5 行代码,更清爽,还线程安全 (final 字段只能初始化一次)。
💡 二、为什么它更香?
| 🌟 优点 | 💬 说明 |
|---|---|
| ✅ 安全 | final 保证依赖在构造时就存在,避免 NPE |
| ✅ 可测试 | 单元测试时直接 new,不依赖 Spring 容器 |
| ✅ 可读性强 | 一眼能看出这个类需要哪些依赖 |
| ✅ 免样板代码 | 不写 @Autowired、不写构造器、代码更干净 |
🧩 三、还能配合其他注入方式吗?
可以,但要懂得"主次分明"。
| 场景 | 写法 | 推荐度 |
|---|---|---|
| 普通 Bean 注入 | private final OrderService orderService; |
✅ 推荐 |
| 指定 Bean | private final @Qualifier("wechatPay") PayClient payClient; |
✅ |
| 配置注入 | @Value("${app.name}") private final String appName; |
✅ |
| 可选依赖 | @Autowired private CacheService cacheService; |
⚙️ 可用但不推荐 |
✅ 例子 1:带 @Qualifier
less
@Service
@RequiredArgsConstructor
public class PayService {
private final @Qualifier("wechatPay") PayClient payClient;
}
✅ 例子 2:可选依赖
less
@RequiredArgsConstructor
@Service
public class UserService {
private final AccountService accountService;
@Autowired(required = false)
private AuditService auditService; // 非必要依赖
}
✅ 例子 3:@Lazy 打破循环依赖
less
@RequiredArgsConstructor
@Service
public class AService {
private final @Lazy BService bService;
}
⚙️ 四、@Value 要不要加 final?
两种写法都能拿到值 ✅
写法 1(推荐)------构造器注入
less
@RequiredArgsConstructor
@Service
public class ConfigService {
@Value("${app.title}")
private final String title;
}
→ 构造时注入,更安全,不会为空。
写法 2------字段注入
kotlin
@Service
public class ConfigService {
@Value("${app.desc}")
private String desc;
}
→ 反射注入,略晚一点,但也能正常工作。
🪶 口诀:
必须配置 → 加
final。可选配置 → 不加也行。
🧠 五、常见坑与注意点
- 字段必须是
final才会进构造器。 - 不要在构造器上再写
@Autowired,功能重复。 - 构造器注入不支持循环依赖 ,用
@Lazy解决。 - IDE 要装 Lombok 插件,否则会报"找不到构造器"。
- 不要混用风格:全类最好都用同一种注入方式。
🧾 六、总结一句话
🧩
@RequiredArgsConstructor让依赖注入变得:
- 更短
- 更稳
- 更优雅
让你的 Spring Boot 代码------像晨雾中的竹林,一目了然,干净利落。