当前位置: 首页 > news >正文

网站的页脚南方网

网站的页脚,南方网,目前网络营销的主要方式,wordpress定制模版开发时间一、异常错误 在使用 IntelliJ IDEA 进行 Spring 开发时,当使用 Autowired 注解直接在字段上进行依赖注入时,IDE 会显示黄色警告: Field injection is not recommended这个警告出现在以下代码模式中: Service public class UserSe…

一、异常错误

在使用 IntelliJ IDEA 进行 Spring 开发时,当使用 @Autowired 注解直接在字段上进行依赖注入时,IDE 会显示黄色警告:

Field injection is not recommended

这个警告出现在以下代码模式中:

@Service
public class UserService {@Autowiredprivate UserRepository userRepository; // 此处会出现警告// 业务方法
}

二、原因

1. 依赖关系不透明(看不出这个类需要什么)

简单理解:就像一个黑盒子,你不知道里面装了什么。

使用 @Autowired 注解直接标注在字段上时,从类的构造函数和方法签名上完全看不出这个类到底需要哪些依赖。

举个例子

// 字段注入 - 看不出依赖关系
public class UserService {@Autowiredprivate UserRepository userRepository;  // 隐藏的依赖@Autowired private EmailService emailService;      // 隐藏的依赖
}// 构造函数注入 - 一目了然
public class UserService {private final UserRepository userRepository;private final EmailService emailService;// 从构造函数就能看出需要哪些依赖public UserService(UserRepository userRepository, EmailService emailService) {this.userRepository = userRepository;this.emailService = emailService;}
}

2. 容易让类变得臃肿(违背单一职责原则)

简单理解:就像一个人身兼数职,什么都管,最后累垮了。

字段注入太方便了,只需要加个 @Autowired 就能引入新依赖,这会让开发者不知不觉地往一个类里塞太多功能。

举个例子

// 不知不觉中类变得很臃肿
public class UserService {@Autowired private UserRepository userRepository;@Autowired private EmailService emailService;@Autowired private SmsService smsService;@Autowired private LogService logService;@Autowired private CacheService cacheService;@Autowired private ValidationService validationService;// ... 还有更多依赖// 这个类现在要管用户、邮件、短信、日志、缓存、验证...// 职责太多了!
}

3. 测试变得复杂(必须启动Spring容器)

简单理解:就像测试一个电器,必须插电才能用,不能单独测试。

使用字段注入的类无法进行纯粹的单元测试,必须启动整个Spring容器才能完成依赖注入,测试变得又慢又复杂。

举个例子

// 字段注入 - 测试困难
public class UserService {@Autowiredprivate UserRepository userRepository;public User findUser(Long id) {return userRepository.findById(id);}
}// 测试时必须这样写
@SpringBootTest  // 必须启动整个Spring容器
class UserServiceTest {@Autowiredprivate UserService userService;@Testvoid testFindUser() {// 测试代码...}
}// 构造函数注入 - 测试简单
public class UserService {private final UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}
}// 测试时可以这样写
class UserServiceTest {@Testvoid testFindUser() {// 直接创建mock对象,不需要Spring容器UserRepository mockRepo = Mockito.mock(UserRepository.class);UserService userService = new UserService(mockRepo);// 测试代码...}
}

4. 运行时才发现问题(编译期发现不了错误)

简单理解:就像定时炸弹,平时看不出问题,运行时才爆炸。

字段注入使用反射机制,如果配置有问题,只有在程序运行时才会报错,而不是在编译时就能发现。

举个例子

public class UserService {@Autowiredprivate UserRepository userRepository;  // 如果这个Bean不存在public void saveUser(User user) {userRepository.save(user);  // 运行到这里才会报空指针异常}
}

5. 对象状态不完整(可能出现空指针)

简单理解:就像一辆车还没装完轮子就开始开,肯定会出问题。

使用字段注入时,对象先被创建,然后Spring再通过反射设置字段值。在这个过程中,对象处于"半成品"状态,如果此时调用方法可能会出现空指针异常。

举个例子

public class UserService {@Autowiredprivate UserRepository userRepository;// 如果在依赖注入完成前调用这个方法public void doSomething() {userRepository.findAll();  // 空指针异常!因为userRepository还是null}
}

总结:字段注入虽然写起来简单,但会带来很多隐患。就像走捷径一样,看似省事,实际上后患无穷。

三、解决方法

方法一:构造函数注入(推荐)

构造函数注入是 Spring 官方推荐的依赖注入方式:

@Service
public class UserService {private final UserRepository userRepository;// Spring 4.3+ 版本可省略 @Autowiredpublic UserService(UserRepository userRepository) {this.userRepository = userRepository;}// 业务方法
}

优势:

  • 依赖关系在构造函数中明确声明
  • 支持 final 关键字,保证对象不可变性
  • 便于单元测试,可直接传入 Mock 对象
  • 在对象创建时就确保所有依赖已就绪

方法二:Setter 方法注入

适用于可选依赖的场景:

@Service
public class UserService {private UserRepository userRepository;@Autowiredpublic void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}// 业务方法
}

适用场景:

  • 依赖是可选的
  • 需要在运行时动态改变依赖
  • 存在循环依赖的特殊情况

方法三:关闭 IDE 警告检查

如果项目中必须使用字段注入,可以关闭相关警告:

操作步骤:

  1. 打开 FileSettings(Windows/Linux)或 IntelliJ IDEAPreferences(Mac)
  2. 导航到 EditorInspections
  3. 搜索 “Spring Core: Common problems”
  4. 取消勾选 “Field injection is not recommended”
  5. 点击 Apply 保存设置

最佳实践建议

必需依赖使用构造函数注入:

@Service
public class OrderService {private final OrderRepository orderRepository;private final PaymentService paymentService;public OrderService(OrderRepository orderRepository, PaymentService paymentService) {this.orderRepository = orderRepository;this.paymentService = paymentService;}
}

可选依赖使用 Setter 注入:

@Service
public class NotificationService {private EmailService emailService;private SmsService smsService;@Autowired(required = false)public void setEmailService(EmailService emailService) {this.emailService = emailService;}@Autowired(required = false)public void setSmsService(SmsService smsService) {this.smsService = smsService;}
}

通过采用构造函数注入作为主要方式,可以编写出更加健壮、易测试和易维护的 Spring 应用程序。

http://www.dtcms.com/a/570367.html

相关文章:

  • 【蓝牙开发】GDBus 与 BlueZ:背景、API 关系与工程实践指南
  • 智慧建设网站组合wordpress源码
  • 网站品牌建设公司施工企业分录
  • 【AI】未来20年个人创业方向
  • Redis有事务吗,和关系型如mysql数据库事务有什么区别
  • 《计算机操作系统》_并发控制:同步(条件变量、信号量、生产者消费者、哲学家吃饭问题)20251104
  • 外贸网站优化免费渠道北京网页设计公司有哪些
  • 怎样凡科建设网站定制手机号码官方网站
  • 广西柳州网站建设郑州展厅设计制作公司
  • 电子商务网站建设经费网站的方案
  • 网站被攻击了怎么办?如何进行DDoS防御?
  • 肯达建设网站用什么做网站最好
  • 网站建设交流论坛地址茂名网站制作推广
  • 个人网站的设计与开发免费静态网页
  • 链表节点复用
  • 【经典书籍】《人月神话》第十三章“金牌团队与银牌团队”精华讲解
  • ThreadPoolExecutor 的七个参数
  • 为进一步加强校园网站建设wordpress 页面 固定链接
  • C 命令行参数
  • 做网站都需要什么工具网站备案 营业执照副本
  • springboot测试临时数据修改指南
  • 从零到一:Kubernetes 基础概念与集群部署详解
  • 如何优化SQL查询性能?测试与开发协同优化指南
  • 衡水安徽网站建设网站建设需要注意什么 知乎
  • 手机怎么制作网站教程视频犀牛云做网站怎么样
  • 苏州建设网站wordpress页面编辑插件
  • 学习Java第五十九天——MySQL篇
  • 公司网站搭建费用用上网做任务的网站
  • 甘肃省城乡与建设厅网站首页关键词是在网站后台做的吗
  • 营销印刷网站wordpress模板网站标题重复