Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将一些注入和一些提供的类放入一个提供的类中_Java_Dagger 2 - Fatal编程技术网

Java 如何将一些注入和一些提供的类放入一个提供的类中

Java 如何将一些注入和一些提供的类放入一个提供的类中,java,dagger-2,Java,Dagger 2,我正在开始使用Dagger 2,并试图找出如何使@注入和@提供的能够很好地协同工作。当顶级类被注入时,很容易让一切正常工作。像这样: class TopLevelClass { @Inject SecondaryClass1 class1; private final SecondaryClass2 class2; @Inject TopLevelClass(SecondaryClass2 class2) { this.class2

我正在开始使用Dagger 2,并试图找出如何使
@注入
@提供的
能够很好地协同工作。当顶级类被注入时,很容易让一切正常工作。像这样:

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
(对于接口的特定实现,以及任何需要配置的对象)。在我看来,这些是非常常见的用例。我不能将注入用于这些类型的对象吗?我发现我需要经常使用
@提供的
(用于接口的特定实现,以及任何需要配置的对象)。在我看来,这些是非常常见的用例。我是否无法对这些类型的对象使用注入?