⚙️ Spring Boot × @RequiredArgsConstructor:写出最干净的依赖注入代码
🚀 一、它是干嘛的?
@RequiredArgsConstructor 是 Lombok 提供的注解,
👉 会自动生成一个包含所有 final 字段的构造方法。
也就是说——只要你把依赖写成 final,Spring Boot 就能自动注入。
再也不用写 @Autowired 或手动构造器啦!
🌱 基础示例:
1 | @Service |
等价于:
1 | @Service |
👉 少了 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
1 | @Service |
✅ 例子 2:可选依赖
1 | @RequiredArgsConstructor |
✅ 例子 3:@Lazy 打破循环依赖
1 | @RequiredArgsConstructor |
⚙️ 四、@Value 要不要加 final?
两种写法都能拿到值 ✅
写法 1(推荐)——构造器注入
1 | @RequiredArgsConstructor |
→ 构造时注入,更安全,不会为空。
写法 2——字段注入
1 | @Service |
→ 反射注入,略晚一点,但也能正常工作。
🪶 口诀:
必须配置 → 加
final。
可选配置 → 不加也行。
🧠 五、常见坑与注意点
- 字段必须是
final才会进构造器。 - 不要在构造器上再写
@Autowired,功能重复。 - 构造器注入不支持循环依赖,用
@Lazy解决。 - IDE 要装 Lombok 插件,否则会报“找不到构造器”。
- 不要混用风格:全类最好都用同一种注入方式。
🧾 六、总结一句话
🧩
@RequiredArgsConstructor让依赖注入变得:
- 更短
- 更稳
- 更优雅
让你的 Spring Boot 代码——像晨雾中的竹林,一目了然,干净利落。
Comments




