首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@自动发稿或私人期末考试

@自动发稿或私人期末考试
EN

Stack Overflow用户
提问于 2022-04-01 19:49:39
回答 5查看 1.9K关注 0票数 2

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

方法1:

代码语言:javascript
复制
 @Autowired
 private CustomerRepository customerRepo;

方法2:

代码语言:javascript
复制
private final CustomerRepository custormerRepo;
 
public StudentService(CustomerRepository customerRepo) {
         this.customerRepo = customerRepo;
}

正如我所看到的,method2中的DI是最近的。但我想问你我该用哪一种?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2022-04-01 20:11:36

TL;DR:方法2要灵活得多。

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

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

不变性:

您不能这样做,这是普通的Java:

代码语言:javascript
复制
@Autowired
private final CustomerRepository customerRepo;

// No constructor that sets "customerRepo".

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

代码语言:javascript
复制
private final CustomerRepository customerRepo;

@Autowired
public StudentService(final CustomerRepository customerRepo) {
  this.customerRepo = customerRepo;
}

不变性有时是可取的。原因之一是它有助于线程安全。另一个是保安。

就我个人而言,我遵循这样的规则:“如果它可以是最终的,那么它应该是最终的。”

测试:

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

NullPointerException**s:** Nasty

对象是通过调用其构造函数来创建的,对吗?我们通常希望我们的参数在传入时是非空的。使用构造函数注入,弹簧IoC容器确保在将构造函数传递给构造函数之前,所有在构造函数中传递的参数都可用。

票数 2
EN

Stack Overflow用户

发布于 2022-04-01 19:54:59

在主代码中,不建议使用方法2作为字段注入(方法1)。(原因见这里 )

在您的测试代码中,可以使用方法1。

票数 0
EN

Stack Overflow用户

发布于 2022-04-01 20:01:05

使用构造函数注入,Spring也推荐它

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71712116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档