我发现在Google Guice中,bind()。to()非常方便。我认为Dagger 2中@Provides和提供者函数的组合有点重。为什么Dagger 2不支持这种糖?
答案 0 :(得分:3)
Dagger是一个编译时注释处理器:它在生成接口实现时并没有实际运行代码,并且(通过javax.annotation.processing.Processor
)在可导航(抽象语法树)或可运行状态下,甚至没有访问到您的方法实现。它只能看到类元素(方法和字段)及其注释,这一定是正确的,因此Dagger可以生成类似DaggerYourComponent
的实现。
bind
语句(包括任何条件,循环,模块子类)。反射创建新实例,Guice将在运行时扫描每个类以确定其依赖性。这使您可以更灵活地调用bind
,但在内存和处理受限的环境中性能要慢得多,特别是在Android reflection is especially slow等环境中。
简而言之,切换到编译时代码生成限制了表达绑定的方式和位置,但在交易中,您可以完全避免反射并获得显着的性能改进。
答案 1 :(得分:1)
技术上,模块允许这样做。
@Module
public class MyModule {
@Provides
MyInterface myInterface(MyClass myClass) { // <-- equivalent of `bind().to()`
return myClass;
}
}
另一种选择:
@Module
public abstract class MyModule {
@Binds // <-- equivalent of `bind().to()`
abstract MyInterface myInterface(MyClass myClass);
}