java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > 为什么@Autowired在属性上被警告,在setter方法上不被警告

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

作者:drebander

在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然而,当@Autowired注解在属性上使用时,IntelliJIDEA等IDE会给出Fieldinjectionisnotrecommended的警告,而在setter方法上使用@Autowired时却不会出现这个警告

在 Spring 开发中,@Autowired 注解常用于实现依赖注入。它可以应用于类的 属性构造器setter 方法 上。然而,当 @Autowired 注解在 属性 上使用时,IntelliJ IDEA 等 IDE 会给出 Field injection is not recommended 的警告,而在 setter 方法 上使用 @Autowired 时却不会出现这个警告。

1. 为什么 @Autowired 在属性上被警告?

1.1 隐式依赖注入

@Autowired 注解应用于类的 属性 上时,Spring 会直接注入该属性,而不通过构造函数或 setter 方法显式地传递依赖项。

这种注入方式称为 字段注入(Field Injection)。

字段注入 的缺点主要体现在以下几个方面:

1.隐式依赖

2.难以进行单元测试

3.违反依赖倒置原则(DIP)

1.2 IDE 的警告:Field injection is not recommended

IntelliJ IDEA 等 IDE 会根据这些设计缺点发出警告,提示 @Autowired 注解不推荐使用在属性上。

字段注入的方式可能会导致代码的可维护性差,容易出现一些潜在问题(如不清晰的依赖关系和难以测试的代码)。

2. 为什么 @Autowired 在 setter 方法上不被警告?

@Autowired 用于 setter 方法 时,Spring 会通过 setter 注入 方式将依赖项注入到对象的属性中。

与字段注入不同,setter 注入方式具有以下优势:

2.1 显式依赖注入

显式依赖关系:使用 setter 方法注入,开发者可以明确看到类所依赖的组件。通过查看类的 setter 方法,其他开发者可以轻松理解该类的依赖关系。

public class MyService {
    private MyRepository repository;
    
    @Autowired
    public void setRepository(MyRepository repository) {
        this.repository = repository;
    }
}

符合依赖注入的设计原则:通过构造函数或 setter 方法注入依赖项,可以使类的依赖关系更加清晰,符合面向对象设计中的 依赖注入单一职责原则

2.2 可选的依赖注入

setter 注入适用于一些 可选依赖 的场景。如果某个依赖是可选的,可以通过 setter 方法来灵活注入,而不需要在构造器中强制要求依赖项的传入。

@Autowired
public void setOptionalDependency(Optional<Dependency> dependency) {
    this.dependency = dependency.orElse(null);
}

2.3 易于测试

MyService myService = new MyService();
myService.setRepository(mockRepository);

3. 构造器注入 vs 字段注入 vs Setter 注入

3.1 构造器注入(推荐)

构造器注入最推荐的依赖注入方式,它具有以下优势:

public class MyService {
    private final MyRepository repository;
    
    @Autowired
    public MyService(MyRepository repository) {
        this.repository = repository;
    }
}

3.2 Setter 注入(次推荐)

Setter 注入 是一个灵活的选择,适用于依赖关系较为可选或后期可更改的场景。它具有以下特点:

public class MyService {
    private MyRepository repository;

    @Autowired
    public void setRepository(MyRepository repository) {
        this.repository = repository;
    }
}

3.3 字段注入(不推荐)

字段注入 是最简单的注入方式,但并不推荐使用,原因已在前面提到。字段注入具有以下缺点:

public class MyService {
    @Autowired
    private MyRepository repository;
}

4. 总结

总体而言,使用构造器注入和 setter 注入能够使代码更清晰、易于维护,同时支持更好的单元测试。

如果 IDE 提示 Field injection is not recommended,这意味着你可以考虑改用构造器注入或 setter 注入,以便提升代码质量。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文