@Autowired,有根黄线并提示ield injection is not recommended

博主在新写Spring Boot项目demo时,使用变量依赖注入mapper接口出现黄线。经排查是Spring Boot版本从2.1升级到2.4,新版本不推荐变量依赖注入,推荐构造器注入。虽构造器注入有不足,但变量注入可能有空指针异常,特定情况可继续用注解简化代码。

好久没写了项目了,新写demo的时候,按照往常正常的使用 @Autowired来注入mapper接口,结果出现了
在这里插入图片描述
为啥会出现一根黄线啊,以前都没有。虽然看着没啥问题,但是看着总是不舒服的的,然后去看了一下和以前的项目有啥区别呢?由于是新的demo,基本啥都还没引入,唯一的差别就是springboot的版本问题,以前是2.1,新的是2.4,新版本出新规范了:使用变量依赖注入的方式是不被推荐的。
那么,应该怎么解决呢?
推荐的是使用构造器注入
在这里插入图片描述
但是也有个问题,如果这个类中有很多mapper或者其他的类,就要写很多啊,没有直接用@Autowired那么简洁,但不推荐肯定是有原因的:不能有效的指明依赖,容易出现空指针异常。但是mapper接口不会出现为空啊,所以完全不用改,接着冲

当这个类无需其他构造方式只有mapper,service注入且又非常多,的时候可直接使用@AllArgsConstructor注解,以简化代码

### 原因分析 在使用 `@Autowire` 注解进行字段注入时,IDE 通常会提示 **Field injection is not recommended** 的警告。这一做法不被推荐的主要原因是:字段注入会导致依赖关系隐藏在类内部,难以通过构造函数或方法参数显式传递依赖对象,从而降低了代码的可测试性和可维护性[^1]。 此外,字段注入使得类在实例化时无法保证所有必要的依赖都已经被正确初始化。例如,当一个类通过 `new` 关键字创建时,Spring 框架无法管理其生命周期和依赖注入,导致注入的字段为 `null`,进而可能引发 `NullPointerException` 异常[^2]。 Spring 官方团队更倾向于使用**构造函数注入(Constructor Injection)**,因为这种注入方式能够实现不可变对象(immutable objects),确保必需的依赖项不会为 `null`。同时,构造函数注入可以保证组件在被客户端调用时始终处于完全初始化状态,提高系统的稳定性和安全性[^4]。 --- ### 替代方案与最佳实践 #### 构造函数注入(Constructor Injection) 构造函数注入是目前推荐的最佳实践之一。它通过构造函数将依赖项传递给目标类,结合 `Assert.notNull()` 方法确保依赖项非空。这种方式不仅提高了代码的可读性,也增强了类的健壮性。 示例: ```java @Service public class UserServiceImpl implements UserService { private final UserRepository userRepository; @Autowired public UserServiceImpl(UserRepository userRepository) { Assert.notNull(userRepository, "UserRepository must not be null"); this.userRepository = userRepository; } // ... } ``` 该方式确保了 `userRepository` 在类初始化时就被正确赋值,避免了字段注入可能导致的空指针问题[^3]。 #### Setter 注入(Setter Injection) 除了构造函数注入之外,也可以使用 `@Autowired` 注解在 setter 方法上进行依赖注入。这种方式适用于可选依赖或需要动态更改依赖的情况。 示例: ```java @Service public class OrderService { private PaymentProcessor paymentProcessor; @Autowired public void setPaymentProcessor(PaymentProcessor paymentProcessor) { this.paymentProcessor = paymentProcessor; } } ``` 虽然 setter 注入提供了灵活性,但在实际开发中仍建议优先使用构造函数注入以保证依赖的完整性。 --- ### 总结 字段注入虽然在语法上简单易用,但由于其潜在的问题(如可测试性差、依赖不明确等),不被 Spring 社区推荐。相比之下,构造函数注入和 setter 注入更能体现良好的设计原则,特别是在大型项目或需要高可维护性的系统中。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值