⚙️ Spring Boot × @RequiredArgsConstructor:写出最干净的依赖注入代码

🚀 一、它是干嘛的?

@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。

可选配置 → 不加也行。


🧠 五、常见坑与注意点

  1. 字段必须是 final 才会进构造器。
  2. 不要在构造器上再写 @Autowired,功能重复。
  3. 构造器注入不支持循环依赖 ,用 @Lazy 解决。
  4. IDE 要装 Lombok 插件,否则会报"找不到构造器"。
  5. 不要混用风格:全类最好都用同一种注入方式。

🧾 六、总结一句话

🧩 @RequiredArgsConstructor 让依赖注入变得:

  • 更短
  • 更稳
  • 更优雅

让你的 Spring Boot 代码------像晨雾中的竹林,一目了然,干净利落。

相关推荐
谢亮_vipxieliang20 小时前
Spring Cloud 服务治理入门:注册发现、配置中心、网关限流、熔断降级与分布式一致性方案
分布式·spring·spring cloud
卷无止境1 天前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
谢亮_vipxieliang1 天前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
狼爷1 天前
从零用 Java 构建 AI Agent 框架:JavaManus 设计与实现深度解析
后端·langchain·aigc
郑州光合科技余经理1 天前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
专业程序开发源1 天前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
专业程序开发源1 天前
springboot社区养老系统44071-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计
小呆呆6661 天前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
周杰伦fans1 天前
8GB显存下模型量化实战指南
人工智能·后端·c#
余槐i1 天前
数据没回滚也不报错:@Transactional 自调用失效的 3 种复现与修复
spring boot·mysql·多线程·spring 事务