如何在提供的类中进行一些注入和提供的类

时间:2019-02-12 04:45:14

标签: java dagger-2

我正在开始使用Dagger 2,并尝试找出如何使@Inject@Provides一起良好地工作。注入顶级类时,很容易使所有工作正常。像这样:

class TopLevelClass {

    @Inject
    SecondaryClass1 class1;

    private final SecondaryClass2 class2;

    @Inject
    TopLevelClass(SecondaryClass2 class2) {
        this.class2 = class2;
    }
}

@Module
class MyModule {

    @Provides
    SecondaryClass2 provideSecondaryClass2() {
        return new SecondaryClass2();
    }
}

但是,当我也必须为顶级类创建一个@Provides方法时,一切都会停止。像这样:

class TopLevelClass {

    @Inject
    SecondaryClass1 class1;

    private final SecondaryClass2 class2;

    TopLevelClass(SecondaryClass2 class2) {
        this.class2 = class2;
    }
}

@Module
class MyModule {

    @Provides
    TopLevelClass provideTopLevelClass(SecondaryClass2 class2) {
        return new TopLevelClass(class2);
    }

    @Provides
    SecondaryClass2 provideSecondaryClass2() {
        return new SecondaryClass2();
    }
}

在此示例中,我发现SecondaryClass1从未注入,因此当我尝试访问它时会得到一个NPE。对于提供的顶级类,我应该采用其他方法吗?

P.S。我认为这无关紧要,但这是我正在使用的组件,以防万一:

@Component(modules = {MyModule.class})
interface MyComponent {

    TopLevelClass getTopLevelClass();

}

谢谢!

1 个答案:

答案 0 :(得分:0)

您有2个选择:

  • 使用构造函数注入,并让Dagger创建和注入对象(没有任何带有@Provides注释的方法),该对象将可以立即使用,无需任何代码。这就是匕首闪耀的地方。
  • 创建对象您自己并确保其正确设置,然后从带有注释的方法@Provides返回

我不知道为什么您会偏爱第二种选择,或者为什么甚至在希望使用构造函数时甚至希望使用字段注入,但是,您发现,如果您选择字段,则不会注入字段手动构造对象。生成的Dagger代码均不会运行-您必须自己执行此操作。

想到的一种方法是请求组件,然后注入对象。

@Provides
TopLevelClass provideTopLevelClass(SecondaryClass2 class2, MyComponent component) {
    TopLevelClass tlc = new TopLevelClass(class2);
    component.inject(tlc);
    return  tlc;
}