提供方法依赖
Provide method dependendies
在文档中它说@Provides 方法可能有自己的依赖关系,比如:
@Provides Pump providePump(Thermosiphon pump) {
return pump;
}
如果我这样写会有什么变化:
@Provides Pump providePump() {
return new Thermosiphon();
}
在第一个片段中:该方法从哪里获得泵?
文档还显示 Thermosiphon
class:
class Thermosiphon implements Pump {
private final Heater heater;
@Inject
Thermosiphon(Heater heater) {
this.heater = heater;
}
...
}
这个class的构造函数用@Inject
注释。这让 Dagger 知道在需要 Thermosiphon
时使用此构造函数,并自动为其提供 Heater
实例,因此您不必这样做。
您自己创建一个新的 Thermospihon
实例是完全可以的,但是 Dagger 这样做可以省去您的麻烦。例如,如果您手动执行此操作,则需要从某处获取一些 Heater
引用。这就是 Dagger 的全部意义所在,因此您不必进行繁琐的重复性工作。
这些实际上是相同的 IF 每次请求实例时都会创建 Thermosiphon.class 的新实例。如果它是单例(或以任何方式限定范围),那么我们就会有所不同。
如果您有以下情况,那么第一个示例是单例的别名。但是,第二个示例每次仍会创建新实例。
@Provides
@Singleton
Thermosiphon provideThermosiphon() {
return new Thermosiphon();
}
就我个人而言,我更喜欢第一种方法。使用第一种方法,您可以稍后添加或更改提供程序,并在实例传递给别名之前调整实例的范围或状态。好像灵活了一点。
它会查找在您的模块中声明的其他 bean
例如:
@Module
public class MainModule {
@Provides
public EmailServiceApiGateway provideEmailServiceApiGateway() {
return new EmailServiceApiGateway();
}
@Provides
public EmailSendingActivityPresenter provideEmailSendingActivityPresenter(EmailServiceApiGateway emailServiceApiGateway) {
return new EmailSendingActivityPresenterImpl(emailServiceApiGateway);
}
}
因此在上述情况下,EmailServiceApiGateway 会自动注入 EmailSendingActivityPresenter。
在文档中它说@Provides 方法可能有自己的依赖关系,比如:
@Provides Pump providePump(Thermosiphon pump) {
return pump;
}
如果我这样写会有什么变化:
@Provides Pump providePump() {
return new Thermosiphon();
}
在第一个片段中:该方法从哪里获得泵?
文档还显示 Thermosiphon
class:
class Thermosiphon implements Pump {
private final Heater heater;
@Inject
Thermosiphon(Heater heater) {
this.heater = heater;
}
...
}
这个class的构造函数用@Inject
注释。这让 Dagger 知道在需要 Thermosiphon
时使用此构造函数,并自动为其提供 Heater
实例,因此您不必这样做。
您自己创建一个新的 Thermospihon
实例是完全可以的,但是 Dagger 这样做可以省去您的麻烦。例如,如果您手动执行此操作,则需要从某处获取一些 Heater
引用。这就是 Dagger 的全部意义所在,因此您不必进行繁琐的重复性工作。
这些实际上是相同的 IF 每次请求实例时都会创建 Thermosiphon.class 的新实例。如果它是单例(或以任何方式限定范围),那么我们就会有所不同。
如果您有以下情况,那么第一个示例是单例的别名。但是,第二个示例每次仍会创建新实例。
@Provides
@Singleton
Thermosiphon provideThermosiphon() {
return new Thermosiphon();
}
就我个人而言,我更喜欢第一种方法。使用第一种方法,您可以稍后添加或更改提供程序,并在实例传递给别名之前调整实例的范围或状态。好像灵活了一点。
它会查找在您的模块中声明的其他 bean
例如:
@Module
public class MainModule {
@Provides
public EmailServiceApiGateway provideEmailServiceApiGateway() {
return new EmailServiceApiGateway();
}
@Provides
public EmailSendingActivityPresenter provideEmailSendingActivityPresenter(EmailServiceApiGateway emailServiceApiGateway) {
return new EmailSendingActivityPresenterImpl(emailServiceApiGateway);
}
}
因此在上述情况下,EmailServiceApiGateway 会自动注入 EmailSendingActivityPresenter。