Java 匕首2-现场注入中的空指针

Java 匕首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

我正在使用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.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);我也会更新这个问题。