我的问题很简单。哪种方法更有效?
方法一:
@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 容器确保构造函数中传递的所有参数在传递到构造函数之前都可用。
| 归档时间: |
|
| 查看次数: |
10024 次 |
| 最近记录: |