Dagger 2 - 字段注入中的空指针

div*_*yum 0 java dependency-injection dagger dagger-2

我正在使用 dagger 2 进行依赖注入,但陷入了字段注入的困境。以下是带有代码示例的完整场景:

假设我们有一个 A 类,它依赖于 B 库

class A {
    @Inject
    B b;
}
Run Code Online (Sandbox Code Playgroud)

B 模块:

@Module
public class BModule {

    @Provides
    @Singleton
    public B provideB() {
        return new C.methodA();
        // C - static class; C.methodA returns B

    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在 A 类中使用时,我会得到空指针异常,但如果我使用构造函数注入b执行相同的操作,那么它会完美运行。我可以保证组件和其他依赖项都很好,因为构造函数部分可以正常工作。

A 是某个其他类(我们称之为 X)的依赖项,并且 A 正在使用构造函数注入进行初始化(已测试)。另外,X 被注入为void inject(X x);

我有两个问题:

  1. 由于未注入,我在现场注入中是否遗漏了任何内容?
  2. 我能够成功编译代码并获得运行时异常,但是 dagger2 是编译时 DI 那么为什么它在编译时无法捕获此异常?

PS:我刚刚分享了部分代码,因为存在多个依赖项,所以只是想解释一下场景。如果问题/场景仍然不清楚或需要更多信息,请告诉我。

谢谢。

Con*_*Var 5

字段注入dagger比构造函数注入稍微复杂一些。当你像这样使用构造函数注入时

class A {
    @Inject
    public A(B b) {}
}
Run Code Online (Sandbox Code Playgroud)

并且您有 B 类提供商

@Module
class DaggerModule {
    @Provides
    B provideB() {}
}
Run Code Online (Sandbox Code Playgroud)

现在 dagger 将知道如何创建实例A并为其传递所需的构造函数参数。所以一切都很好,编译成功并且运行完美。

但如果我们谈论场注入

class A {
    @Inject
    B b;
}
Run Code Online (Sandbox Code Playgroud)

并且在某处提供了B,dagger 无法知道如何创建A实例以及何时注入b属性(在手动创建实例的情况下A)。为了使其工作,您需要在组件中编写特殊方法

@Component(DaggetModule.class)
interface DaggerComponent {
    void inject(A a);
}
Run Code Online (Sandbox Code Playgroud)

以及代码中的某处

A a = new A();
DaggerComponent component = //TODO getDaggerComponent()
component.inject(a);
Run Code Online (Sandbox Code Playgroud)

之后该b属性将被初始化并可供以后使用。希望现在已经清楚如何进行现场注入工作了。