Java 匕首2-现场注入中的空指针
我正在使用dagger 2进行依赖项注入,但被字段注入卡住了。下面是完整的场景和代码示例: 假设我们有一个依赖于库B的类aJava 匕首2-现场注入中的空指针,java,dependency-injection,dagger-2,dagger,Java,Dependency Injection,Dagger 2,Dagger,我正在使用dagger 2进行依赖项注入,但被字段注入卡住了。下面是完整的场景和代码示例: 假设我们有一个依赖于库B的类a class A { @Inject B b; } B模块: @Module public class BModule { @Provides @Singleton public B provideB() { return new C.methodA(); // C - static class; C
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正在使用构造函数注入(tested)进行初始化。另外,X被注入为void注入(X X)代码>
我有两个问题:
是否有任何我在现场注射中遗漏的东西,因为它没有被注射
我能够成功地编译代码并获得运行时异常,但是dagger2是编译时DI,那么为什么它在编译时无法捕捉到这一点呢
注:我刚刚分享了部分代码,因为有多个依赖项,所以我只是想解释一下这个场景。如果问题/场景仍不清楚或需要更多信息,请告知我
谢谢。dagger
中的字段注入比构造函数注入要复杂一些。当您像这样使用构造函数注入时
class A {
@Inject
public A(B b) {}
}
你们有B类的提供者
@Module
class DaggerModule {
@Provides
B provideB() {}
}
现在dagger将知道如何创建A
的实例,并将所需的构造函数参数传递给它。所以一切都很好,编译成功,工作完美
但如果我们谈到现场注入
class A {
@Inject
B b;
}
并且有B
的某处提供者,dagger不知道如何创建A
实例以及何时注入B
属性(在手动创建A
实例的情况下)。要使其工作,您需要在组件中编写特殊的方法
@Component(DaggetModule.class)
interface DaggerComponent {
void inject(A a);
}
在代码的某个地方
A a = new A();
DaggerComponent component = //TODO getDaggerComponent()
component.inject(a);
之后,
b
属性将被初始化并可供以后使用。希望,现在很清楚如何使现场注入工作。dagger中的现场注入比构造函数注入要复杂一些。当您像这样使用构造函数注入时
class A {
@Inject
public A(B b) {}
}
你们有B类的提供者
@Module
class DaggerModule {
@Provides
B provideB() {}
}
现在dagger将知道如何创建A
的实例,并将所需的构造函数参数传递给它。所以一切都很好,编译成功,工作完美
但如果我们谈到现场注入
class A {
@Inject
B b;
}
并且有B
的某处提供者,dagger不知道如何创建A
实例以及何时注入B
属性(在手动创建A
实例的情况下)。要使其工作,您需要在组件中编写特殊的方法
@Component(DaggetModule.class)
interface DaggerComponent {
void inject(A a);
}
在代码的某个地方
A a = new A();
DaggerComponent component = //TODO getDaggerComponent()
component.inject(a);
之后,
b
属性将被初始化并可供以后使用。希望,现在很清楚如何使字段注入工作。谢谢@consorvar,我忘了在这里提到A是其他类的依赖项(我们称之为X),并且A正在正确初始化。此外,X正在按照您的建议进行初始化,即void inject(X X);我也会更新这个问题。谢谢@consorvar,我忘了在这里提到A是其他类的依赖项(我们称之为X),并且A被正确初始化。此外,X正在按照您的建议进行初始化,即void inject(X X);我也会更新这个问题。