我的问题很简单。哪种方法更有效?
方法1:
@Autowired
private CustomerRepository customerRepo;方法2:
private final CustomerRepository custormerRepo;
public StudentService(CustomerRepository customerRepo) {
this.customerRepo = customerRepo;
}正如我所看到的,method2中的DI是最近的。但我想问你我该用哪一种?
发布于 2022-04-01 20:11:36
TL;DR:方法2要灵活得多。
方法1是字段注入的示例,方法2是构造函数注入的示例。
字段注入具有构造函数注入避免的缺点。下面是构造函数注入的一些优点:
不变性:
您不能这样做,这是普通的Java:
@Autowired
private final CustomerRepository customerRepo;
// No constructor that sets "customerRepo".因此,Spring提供了构造函数注入:
private final CustomerRepository customerRepo;
@Autowired
public StudentService(final CustomerRepository customerRepo) {
this.customerRepo = customerRepo;
}不变性有时是可取的。原因之一是它有助于线程安全。另一个是保安。
就我个人而言,我遵循这样的规则:“如果它可以是最终的,那么它应该是最终的。”
测试:
您不需要反射来设置依赖项。是的,许多模拟框架为您处理这个问题,但是使用构造函数注入,您可以选择在构造函数上调用new。
NullPointerException**s:** Nasty
对象是通过调用其构造函数来创建的,对吗?我们通常希望我们的参数在传入时是非空的。使用构造函数注入,弹簧IoC容器确保在将构造函数传递给构造函数之前,所有在构造函数中传递的参数都可用。
发布于 2022-04-01 19:54:59
在主代码中,不建议使用方法2作为字段注入(方法1)。(原因见这里 )
在您的测试代码中,可以使用方法1。
发布于 2022-04-01 20:01:05
使用构造函数注入,Spring也推荐它
https://stackoverflow.com/questions/71712116
复制相似问题