@Autowired 或私人决赛

7 spring spring-boot

我的问题很简单。哪种方法更有效?

方法一:

 @Autowired
 private CustomerRepository customerRepo;
Run Code Online (Sandbox Code Playgroud)

方法2:

private final CustomerRepository custormerRepo;
 
public StudentService(CustomerRepository customerRepo) {
         this.customerRepo = customerRepo;
}
Run Code Online (Sandbox Code Playgroud)

正如我所看到的,method2 中的 DI 是更新的。但我想问一下,我该用哪一个呢?

Oli*_*ver 10

TL;DR:方法 2 更加灵活。

方法1是字段注入的示例,方法2是构造函数注入的示例。

字段注入有一些构造函数注入可以避免的缺点。以下是构造函数注入的一些优点:

不变性:

你不能用普通的 Java 来做到这一点:

@Autowired
private final CustomerRepository customerRepo;

// No constructor that sets "customerRepo".
Run Code Online (Sandbox Code Playgroud)

因此,Spring 提供了构造函数注入:

private final CustomerRepository customerRepo;

@Autowired
public StudentService(final CustomerRepository customerRepo) {
  this.customerRepo = customerRepo;
}
Run Code Online (Sandbox Code Playgroud)

有时,不变性是首选。原因之一是它有助于线程安全。另一个是安全。

就我个人而言,我遵循的规则是“如果可以是最终的,就应该是最终的”。编辑 23-05-23:如果您正在编写库,则此规则没有意义,因为您希望轻松扩展和更改功能。

测试:

您不需要反射来设置依赖项。是的,许多模拟框架都会为您处理这个问题,但是通过构造函数注入,您可以选择调用new构造函数。

讨厌NullPointerException的:

一个对象是通过调用它的构造函数来创建的,对吗?我们通常希望参数在传入时为非空。通过构造函数注入,Spring IoC 容器确保构造函数中传递的所有参数在传递到构造函数之前都可用。