Dependency injection 通过构造函数注入和通过Guice的字段注释注入有什么区别?
我有下面的代码来使用Guice进行依赖项注入。第一个是使用构造函数注入,而另一个是直接在字段上方添加Dependency injection 通过构造函数注入和通过Guice的字段注释注入有什么区别?,dependency-injection,guice,Dependency Injection,Guice,我有下面的代码来使用Guice进行依赖项注入。第一个是使用构造函数注入,而另一个是直接在字段上方添加@Inject。这两种方法有什么区别吗?Guice官方网站上似乎推荐了构造函数注入 class BillingService { private final CreditCardProcessor processor; private final TransactionLog transactionLog; @Inject BillingService(Credi
@Inject
。这两种方法有什么区别吗?Guice官方网站上似乎推荐了构造函数注入
class BillingService {
private final CreditCardProcessor processor;
private final TransactionLog transactionLog;
@Inject
BillingService(CreditCardProcessor processor, TransactionLog transactionLog) {
this.processor = processor;
this.transactionLog = transactionLog;
}
...
}
以及:
这里有一个区别。在后一种情况下,注入是完全构建
BillingService
实例的唯一方法。如果出于任何原因,您需要构建一个没有注入的模型,那么您不能(至少使用所示的方法)
在前一种情况下,如果你有理由想这样做,你仍然可以用老式的方式建造一个:
new BillingService(someProcessor, someLog);
我曾在一个团队中工作过,一个团队以一种方式工作,另一个团队以另一种方式工作。在大多数情况下,我一直在使用注射,甚至是测试。但是偶尔在单元测试中,我会发现以非Guicy方式构造某些东西很方便,在这种情况下,构造函数注入确实为您带来了这种灵活性。我要指出的区别是:
- 如果没有构造函数注入,您将无法使用
修饰符,也就是说,上面的代码将无法编译。评论最终成员的优势在这里是离题的final
- 对于构造函数注入,所有依赖项都是强制性的。在不了解每个声明的依赖项的情况下,您将无法实例化该类
- 使用构造函数注入编写测试用例可能会更容易(参见111的答案)
- 还有另一种类型的DI-setter注入-可以更自然地与构造函数注入混合(例如,用于分离强制依赖项和可选依赖项)
new BillingService(someProcessor, someLog);