提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我正在使用匕首2进行依赖注入,并陷入了字段注入 。 以下是带有代码示例的完整方案:
假设我们有一个类A,它依赖于库B
class A {
@Inject
B b;
}
B模块:
@Module
public class BModule {
@Provides
@Singleton
public B provideB() {
return new C.methodA();
// C - static class; C.methodA returns B
}
}
但是,当我尝试在类A中使用b
,我会得到空指针异常,但是如果我使用构造函数注入进行相同操作,则它会完美地工作。 我可以确保组件和其他依赖项都可以正常使用,因为构造器部件可以正常工作。
A是其他类的依赖项(让我们调用X),并且正在使用构造函数注入(已测试)来初始化A。 同样,X被作为void inject(X x);
我有两个问题:
PS:由于存在多个依赖关系,我只是共享了一部分代码,因此仅尝试解释这种情况。 让我知道问题/场景是否仍然不清楚或需要更多信息。
谢谢。
dagger
中的字段注入比构造函数注入更为复杂。 当您像这样使用构造函数注入时
class A {
@Inject
public A(B b) {}
}
并且您有B类的提供者
@Module
class DaggerModule {
@Provides
B provideB() {}
}
现在,匕首将知道如何创建A
实例并将其传递给必需的构造函数参数。 因此,一切都很好,可以成功编译并且可以完美工作。
但是如果我们谈论场注入
class A {
@Inject
B b;
}
并且在某处有B
提供者,匕首不知道如何创建A
实例以及何时注入b
属性(在手动创建A
实例的情况下)。 为了使其正常工作,您需要在组件中编写特殊的方法
@Component(DaggetModule.class)
interface DaggerComponent {
void inject(A a);
}
在代码中的某个地方
A a = new A();
DaggerComponent component = //TODO getDaggerComponent()
component.inject(a);
之后, b
属性将被初始化并可供以后使用。 希望,现在很清楚如何使场注入工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.