我正在尝试Dagger处理我的项目。
但是我在编译期间在我的一个类上得到以下异常:
错误:Foo上没有可注射成员。是否要添加可注入的构造函数?
但是,该类没有依赖关系,因此使用默认的no-arg构造函数:
public class Foo
{
...
}
我真的必须添加一个像下面这样的可注射无参数构造函数吗?
public class Foo
{
@Inject
public Foo()
{
}
....
}
答案 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以少量冗长的代价选择了更多的正确性保证。