Field injection is not recommended – Spring IOC

时间:2024-10-20 22:26:23

在运行静态代码分析工具或从IDE检查/分析代码时,你可能会遇到以下关于@Autowired字段的警告:Field injection is not recommended

一、Spring IOC的注入类型有三种
  • 基于构造函数的依赖注入;
  • 基于Setter的依赖注入;
  • 基于字段的依赖注入;
二、基于字段的依赖注入缺陷
2.1 不允许不可变字段声明:

​ 基于字段的依赖注入不适用于声明final/immutable的字段,因为这些字段必须在类实例化时实例化。声明不可变依赖关系的唯一方法是使用基于构造函数的依赖注入。

2.2 容易违反单一职责设计原则:

​ 在面向对象计算机编程中,SOLID首字母缩略词定义了五个设计原则,这些原则将使你的代码易于理解、灵活和可维护。

​ SOLID中的S代表单一职责原则,这意味着一个类只应负责软件应用程序功能的一部分,其所有服务都应与该责任紧密结合。

​ 使用基于字段的依赖注入,在你的类中很容易有很多依赖关系,一切看起来很好。如果使用基于构造函数的依赖注入,随着更多的依赖关系被添加到你的类中,构造函数会变的越来越大,代码开始变的冗肿。

​ 拥有一个包含十多个参数的构造函数是一个明显的迹象,表明该类有太多的协作者,这可能是开始将该类拆分为更小、更易于维护模块的好机会。

​ 因此,字段依赖注入不是打破单一职责的直接原因,但它隐藏了很多信号,使我们很容易忽略这些信号。

2.3 与依赖注入容器紧密耦合:

​ 使用基于字段的注入的主要原因是避免getter和setter的样板代码或为类创建构造函数。最后,这意味着设置这些字段的唯一方法是通过Spring容器实例化类并使用反射注入他们,否则字段将保持为null,你的类将会被破坏或者无用。

​ 依赖注入设计模式将类依赖关系的创建与类本身分开,将这一责任转移给IOC容器,允许程序设计松散耦合,并遵循单一职责和依赖反转原则。因此,通过自动装配(autowiring)字段来实现的类的解耦,最终会因为再次与IOC容器耦合而丢失,从而使类在Spring容器之外变得无用。

2.4 隐藏依赖关系

在使用依赖注入时,受影响的类应该使用公共接口清楚地公开这些依赖项,方法是在构造函数中公开所需的依赖项,或者使用方法(setter)公开可选的依赖项。当使用基于字段的依赖注入时,实质上是将这些依赖对外隐藏了。

参考文档:https://blog.marcnuri.com/field-injection-is-not-recommended?spm=a2c6h.12873639.article-detail.9.c0b370fevQimF5
开源SDK:https://github.com/mingyang66/spring-parent