在文档中,它说@Provides方法可能依赖于它们,例如:
@Provides Pump providePump(Thermosiphon pump) {
return pump;
}
如果我这样写的话会有什么变化:
@Provides Pump providePump() {
return new Thermosiphon();
}
在第一个剪辑中:该方法从何处获取泵?
答案 0 :(得分:2)
文档还显示了Thermosiphon
类:
class Thermosiphon implements Pump {
private final Heater heater;
@Inject
Thermosiphon(Heater heater) {
this.heater = heater;
}
...
}
此类的构造函数使用@Inject
进行注释。这使得Dagger知道在需要Thermosiphon
时使用此构造函数,并自动向其提供Heater
实例,因此您不必这样做。
你自己创建一个新的Thermospihon
实例是完全没问题的,但是Dagger可以通过这样做来省去你的麻烦。例如,如果您手动执行此操作,则需要从某处获得一些Heater
引用。这就是Dagger的意义所在,所以你不必做冗长乏味的重复工作。
答案 1 :(得分:2)
这些实际上是相同的 IF 每次请求实例时都会创建一个新的Thermosiphon.class实例。如果它是单身(或任何方式),那么我们就会有所不同。
如果您有以下内容,那么第一个示例是单例的别名。但是,第二个示例仍然会每次创建新实例。
@Provides
@Singleton
Thermosiphon provideThermosiphon() {
return new Thermosiphon();
}
就个人而言,我更喜欢第一种方法。使用第一种方法,您可以稍后添加或更改提供程序,并在将实例传递给别名之前调整实例的范围或状态。它看起来有点灵活。
答案 2 :(得分:0)
它查找模块中声明的其他bean
例如:
@Module
public class MainModule {
@Provides
public EmailServiceApiGateway provideEmailServiceApiGateway() {
return new EmailServiceApiGateway();
}
@Provides
public EmailSendingActivityPresenter provideEmailSendingActivityPresenter(EmailServiceApiGateway emailServiceApiGateway) {
return new EmailSendingActivityPresenterImpl(emailServiceApiGateway);
}
}
因此,在上面的案例中,EmailServiceApiGateway会自动注入EmailSendingActivityPresenter。