我开始使用匕首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,当我尝试访问它。有没有办法,我应该对所提供的顶级类做不同的方式?
附:我不认为这是相关的,但这里是我用以防万一它重要的组成部分:
@Component(modules = {MyModule.class})
interface MyComponent {
TopLevelClass getTopLevelClass();
}
谢谢!
你有2种选择:
@Provides
法)的对象将准备,而无需任何代码使用。这是匕首眼前一亮。@Provides
注解的方法返回之前确保其正确设置我不知道为什么你宁愿第二个选项,或者为什么你甚至会想使用字段注入的时候,您可以利用构造的,但是,当你发现了,田也不会,如果你手动构造注入宾语。生成的匕首代码都不会跑 - 你有这自己做。
我想到的一个方法是要求该组件,然后注入对象。
@Provides
TopLevelClass provideTopLevelClass(SecondaryClass2 class2, MyComponent component) {
TopLevelClass tlc = new TopLevelClass(class2);
component.inject(tlc);
return tlc;
}