为什么Google Dagger 2中没有bind()。to()函数?

时间:2017-05-23 17:34:12

标签: dependency-injection guice dagger-2

我发现在Google Guice中,bind()。to()非常方便。我认为Dagger 2中@Provides和提供者函数的组合有点重。为什么Dagger 2不支持这种糖?

2 个答案:

答案 0 :(得分:3)

Dagger是一个编译时注释处理器:它在生成接口实现时并没有实际运行代码,并且(通过javax.annotation.processing.Processor )在可导航(抽象语法树)或可运行状态下,甚至没有访问到您的方法实现。它只能看到类元素(方法和字段)及其注释,这一定是正确的,因此Dagger可以生成类似DaggerYourComponent的实现。

相比之下,Guice完全是一个运行时/反射框架,每次创建Injector时都会运行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);
}