Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 通过构造函数注入和通过Guice的字段注释注入有什么区别?_Dependency Injection_Guice - Fatal编程技术网

Dependency injection 通过构造函数注入和通过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

我有下面的代码来使用Guice进行依赖项注入。第一个是使用构造函数注入,而另一个是直接在字段上方添加
@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);