繁体   English   中英

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

Dagger 2 - Null Pointer in Field Injection

提示:本站收集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);

我有两个问题:

  1. 由于没有被注入,我有什么地方缺少注入方法吗?
  2. 我能够成功地编译代码并获得运行时异常,但是dagger2是编译时DI,那么为什么在编译时却无法捕获到该异常?

PS:由于存在多个依赖关系,我只是共享了一部分代码,因此仅尝试解释这种情况。 让我知道问题/场景是否仍然不清楚或需要更多信息。

谢谢。

1 个回复

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.

相关问题
 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM