Dagger默认构造函数

时间:2013-08-20 14:04:27

标签: dagger

我正在尝试Dagger处理我的项目。

但是我在编译期间在我的一个类上得到以下异常:

  

错误:Foo上没有可注射成员。是否要添加可注入的构造函数?

但是,该类没有依赖关系,因此使用默认的no-arg构造函数:

public class Foo
{
    ...
}

我真的必须添加一个像下面这样的可注射无参数构造函数吗?

public class Foo
{
     @Inject
     public Foo()
     {
     }

     ....
}

1 个答案:

答案 0 :(得分:29)

来自docs

  

Dagger无法构建缺少@Inject注释的类。

Dagger主动要求您通过添加no-args构造函数或添加可注入字段将@Inject添加到您的注入类中。第三个选项是从@Provides方法返回类,如下所示:

@Module(...)
class MyModule {
  @Provides Foo provideFoo() {
    return new Foo(); // Foo is not injectable.
  }
}

这看起来像是额外的样板,但是从Guice和其他框架的经验来看,随机类的JIT绑定最终会出现错误。我们已经看到java.lang.String注入了东西,并且因为有人忘了绑定它,你最后注入了“”而不是所需的字符串。因此,Dagger需要@Inject构造函数或字段。(Guice可选择在4.x中使用它,但为了向后兼容,默认情况下它是关闭的)

这是一个罕见的例子,Dagger以少量冗长的代价选择了更多的正确性保证。