Java 如何将一些注入和一些提供的类放入一个提供的类中
我正在开始使用Dagger 2,并试图找出如何使Java 如何将一些注入和一些提供的类放入一个提供的类中,java,dagger-2,Java,Dagger 2,我正在开始使用Dagger 2,并试图找出如何使@注入和@提供的能够很好地协同工作。当顶级类被注入时,很容易让一切正常工作。像这样: class TopLevelClass { @Inject SecondaryClass1 class1; private final SecondaryClass2 class2; @Inject TopLevelClass(SecondaryClass2 class2) { this.class2
@注入和@提供的能够很好地协同工作。当顶级类被注入时,很容易让一切正常工作。像这样:
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();
}
}
然而,当我不得不为顶级类提供一个@方法时,一切都停止了。像这样:
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();
}
谢谢 您有两种选择:
- 使用构造函数注入并让Dagger创建并注入对象(不使用任何
@提供的
注释方法),对象将随时可用,无需任何代码。这就是匕首闪耀的地方
- 在从
@提供的
注释方法返回对象之前,请自己创建对象并确保其设置正确
我不知道为什么您更喜欢第二个选项,或者为什么您甚至希望在可以使用构造函数的情况下使用字段注入,但是,正如您所发现的,如果您手动构造对象,字段将不会被注入。生成的Dagger代码都不会运行,您必须自己执行此操作
想到的一种方法是请求组件,然后注入对象
@Provides
TopLevelClass provideTopLevelClass(SecondaryClass2 class2, MyComponent component) {
TopLevelClass tlc = new TopLevelClass(class2);
component.inject(tlc);
return tlc;
}
您有两种选择:
- 使用构造函数注入并让Dagger创建并注入对象(不使用任何
@提供的
注释方法),对象将随时可用,无需任何代码。这就是匕首闪耀的地方
- 在从
@提供的
注释方法返回对象之前,请自己创建对象并确保其设置正确
我不知道为什么您更喜欢第二个选项,或者为什么您甚至希望在可以使用构造函数的情况下使用字段注入,但是,正如您所发现的,如果您手动构造对象,字段将不会被注入。生成的Dagger代码都不会运行,您必须自己执行此操作
想到的一种方法是请求组件,然后注入对象
@Provides
TopLevelClass provideTopLevelClass(SecondaryClass2 class2, MyComponent component) {
TopLevelClass tlc = new TopLevelClass(class2);
component.inject(tlc);
return tlc;
}
嗯,如果可以的话,你应该更喜欢构造函数
注入而不是字段
注入。在你的情况下,这是可能的。如果使用field
injection,则需要在某处调用Component.injection(target)
其中target是class,哪些字段标记有@injection
注释-在这种情况下,dagger将构造所有必需的实例并将它们设置为适当的字段。对,我当然更喜欢构造函数注入,而不是字段注入。有时由于可配置对象之类的原因以及需要返回接口的特定实现时,我不得不使用@提供的。对于这些情况,我必须使用字段注入吗?嗯,如果可以的话,你应该更喜欢constructor
injection而不是field
injection。在你的情况下,这是可能的。如果使用field
injection,则需要在某处调用Component.injection(target)
其中target是class,哪些字段标记有@injection
注释-在这种情况下,dagger将构造所有必需的实例并将它们设置为适当的字段。对,我当然更喜欢构造函数注入,而不是字段注入。有时由于可配置对象之类的原因以及需要返回接口的特定实现时,我不得不使用@提供的。对于这些情况,我必须使用字段注入吗?我发现我需要经常使用@Provides
(对于接口的特定实现,以及任何需要配置的对象)。在我看来,这些是非常常见的用例。我不能将注入用于这些类型的对象吗?我发现我需要经常使用@提供的(用于接口的特定实现,以及任何需要配置的对象)。在我看来,这些是非常常见的用例。我是否无法对这些类型的对象使用注入?