在使用 IDEA 开发 SpringBoot 项目时,在Controller类中使用注解 @Autowired 注入一个依赖出现了警告提示。这是怎么回事?

当鼠标悬停在警告线处时,IDEA显示提示不推荐使用Field注入。点击提示后,IDEA会帮助用户自动生成更优的代码结构。

1.当我们鼠标停留在警告线处会出现提示:Field injection is not recommended(不建议Field注入)

2.点击提示,IDEA自动为我们构造,

`@RequiredArgsConstructor` 是 Lombok 提供的一个注解,它会**自动生成一个构造函数(constructor)**,该构造函数包含中所有带有 `final` 修饰符的字段,或者被标记为 `@NonNull` 的 `final` 字段(具体行为可配置)。当你在 SpringSpring Boot 的 `@Controller` 或 `@RestController` 使用这个注解,如果依赖注入的字段是 `final` 的,那么 Lombok 会生成一个包含这些字段的构造函数,而 **Spring 容器支持通过构造函数进行依赖注入**,因此你就不需要再显式使用 `@Autowired`。 --- ### ✅ 示例代码说明: ```java @RestController @RequiredArgsConstructor public class UserController { private final UserService userService; private final EmailService emailService; } ``` Lombok 在编译会自动为你生成如下构造函数: ```java @Autowired // Spring 5+ 可以省略 @Autowired 当只有一个构造函数 public UserController(UserService userService, EmailService emailService) { this.userService = userService; this.emailService = emailService; } ``` > 注意:从 Spring Framework 4.3 开始,如果一个**只有一个构造函数**,Spring 会自动使用该构造函数进行依赖注入,**无需显式添加 `@Autowired`**。所以即使没有写 `@Autowired`,Spring 也会自动注入--- ### 🔍 为什么不需要 `@Autowired`? 1. **Lombok 生成了构造函数** - `@RequiredArgsConstructor` 为 `final` 字段生成构造函数。 2. **Spring 自动装配构造函数** - 如果只有一个构造函数,Spring 会默认用它来注入 Bean,无需 `@Autowired`。 - 即使有多个构造函数,如果你在那个构造函数上加了 `@Autowired`,Spring 才知道用哪个。但单构造函数场景下可以省略。 3. **推荐使用构造函数注入** - 相比于字段注入(`@Autowired` on field),构造函数注入更利于测试、不可变性和依赖清晰。 --- ### ⚠️ 对比:传统方式(不使用 Lombok) ```java @RestController public class UserController { private final UserService userService; private final EmailService emailService; @Autowired public UserController(UserService userService, EmailService emailService) { this.userService = userService; this.emailService = emailService; } } ``` 这和上面 Lombok 生成的效果完全一样,但代码更冗长。 --- ### ✅ 最佳实践建议 - 将服务依赖声明为 `private final` - 使用 `@RequiredArgsConstructor` - 不需要 `@Autowired`(前提是只有一个构造函数) - 启用 Lombok 插件(IDEA/Eclipse 需要安装插件) --- ### ❌ 错误用法示例 ```java @RequiredArgsConstructor @RestController public class UserController { private UserService userService; // 没有 final,不会被包含进构造函数! } ``` 这样生成的构造函数为空,无法注入 `userService`,运行报 `NullPointerException`。 --- ### 总结 | 方式 | 是否需要 @Autowired | 说明 | |------|---------------------|------| | 字段注入 (`@Autowired private UserService x;`) | 是(或隐式支持) | 不推荐,不利于测试 | | 构造函数注入(手动写) | 可省略(仅一个构造函数) | 推荐 | | `@RequiredArgsConstructor` + `final` 字段 | **不需要** | 最简洁、最推荐 | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值