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

新版IDEA提示@Autowired不建议字段注入

       随着项目的复杂度的增加,我们通常会在一个业务类中注入其他过多的业务类。从而使当前的业务层扩充成一个大而全的功能模块。那么就容易出现一下问题

  • 字段注入会让依赖关系变得不那么明显,因为你无法通过构造函数看到所有的依赖项。使用构造函数时,所有必需的组件都会在方法签名中列出,使得依赖关系更加清晰。
  • 如果 @Autowired 注解的字段没有注入成功,且后续使用时没有进行空值检查,可能会导致空指针异常(NullPointerException)。构造函数注入可以确保所有必须依赖项在对象构造时被提供,当未能注入时,构造过程将失败并抛出异常。
  • 使用字段注入可能导致循环依赖问题,尤其是在两个或多个 beans 互相依赖时。Spring 容器可以通过 setter 注入来解决循环依赖,但构造函数注入则不可以。
  • 字段注入会隐藏依赖的生命周期管理特性。当需要进行作用域(如单例、原型等)的特定管理时,构造函数注入更直观,且不容易出现意外的作用域问题。

       尽管字段注入是一种简单的方法,可以快速快速获得依赖,但它并不是最佳实践。为了确保代码的可维护性、可测试性和清晰性,推荐使用构造函数注入和方法注入。通过这种方式,你可以明确依赖关系,避免潜在的问题,并提升代码的质量和可读性。

      使用字段注入

@Slf4j
@Service
@Transactional
public class StockService {@Autowiredprivate MaterialService materialService;@Autowiredprivate StorageLocationService storageLocationService;@Autowiredprivate StorageStockService storageStockService;@Autowiredprivate StorageStockMovementsService storageStockMovementsService;@Autowiredprivate StorageInboundService storageInboundService;@Autowiredprivate StorageInboundMaterialService storageInboundMaterialService;
}

    (StockService 是专门的服务组合,将多个业务服务提取到一个类中,管理它们的交互。避免违反了单一职责原则)       

       使用构造器(推荐)

@Slf4j
@Service
@Transactional
public class StockService {private final MaterialService materialService;private final StorageLocationService storageLocationService;private final StorageStockService storageStockService;private final StorageStockMovementsService storageStockMovementsService;private final StorageInboundService storageInboundService;private final StorageInboundMaterialService storageInboundMaterialService;public StockService(MaterialService materialService, StorageLocationService storageLocationService, StorageStockService storageStockService, StorageStockMovementsService storageStockMovementsService, StorageInboundService storageInboundService, StorageInboundMaterialService storageInboundMaterialService) {this.materialService = materialService;this.storageLocationService = storageLocationService;this.storageStockService = storageStockService;this.storageStockMovementsService = storageStockMovementsService;this.storageInboundService = storageInboundService;this.storageInboundMaterialService = storageInboundMaterialService;}
}

        有助于提高类的可测试性。如果项目使用了 Lombok,可以考虑使用 @Autowired 和 @AllArgsConstructor 来减少样板代码。

@Slf4j
@Service
@Transactional
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class StockService {private final MaterialService materialService;private final StorageLocationService storageLocationService;private final StorageStockService storageStockService;private final StorageStockMovementsService storageStockMovementsService;private final StorageInboundService storageInboundService;private final StorageInboundMaterialService storageInboundMaterialService;
}

http://www.lryc.cn/news/438019.html

相关文章:

  • adb的安装和使用 以及安装Frida 16.0.10+雷电模拟器
  • 解决移动端1px 边框优化的8个方法
  • 频带宽度固定,如何突破数据速率的瓶颈?
  • Linux网络编程 --- 高级IO
  • Python中给定一个数组a = [2,3,9,1,0],找出其中最大的一个数,并打印出来 求解?
  • 系统优化工具 | PC Cleaner v9.7.0.3 绿色版
  • JavaSE、JavaEE 与 JavaWeb 的详解与区别
  • HCIE和CCIE,哪个含金量更高点?
  • 2024.9.14 Python与图像处理新国大EE5731课程大作业,马尔可夫随机场和二值图割,校正立体图像的深度
  • 工业大模型市场图谱:53个工业大模型全面梳理
  • 【代码随想录训练营第42期 Day58打卡 - 图论Part8 - 拓扑排序
  • JVM内部结构解析
  • 誉龙视音频综合管理平台 RelMedia/FindById SQL注入漏洞复现
  • MATLAB系列01:MATLAB介绍
  • GEE 按范围导出 Sentinel-2 卫星影像
  • 队列OJ题——用队列实现栈
  • RK3588镜像打包制作,替换文件系统
  • Open-Sora代码详细解读(2):时空3D VAE
  • 基于微信平台的旅游出行必备商城小程序+ssm(lw+演示+源码+运行)
  • AI绘画:科技赋能艺术的崭新时代
  • 性能诊断的方法(四):自下而上的资源诊断方法和发散的异常信息诊断方法
  • GDPU Vue前端框架开发 计数器
  • 最大流笔记
  • el-tree父子不互相关联时,手动实现全选、反选、子级全选、清空功能
  • 模板与泛型编程笔记(一)入门篇
  • 浅谈WebApi
  • 9月14日,每日信息差
  • 无人机控制与三维AI感知处理平台正式上线!
  • 9.11-kubeadm方式安装k8s
  • 限流,流量整形算法