如何使用dagger 2注入pojo依赖项?

时间:2016-02-16 21:04:53

标签: java android dagger-2

我有一个简单的pojo类:

public class MySimpleClass {

    private List<String> mDependency;

    public MySimpleClass (List<String> dependency) {
        mDependency = dependency;
    }
}

我正在尝试使用dagger 2使用依赖注入创建它。现在我有一个简单的模块和组件:

@Module
public class MySimpleClassModule {

    @Provides
    MySimpleClass provideMySimpleClass(List<String> dependency) {
        return new MySimpleClass(dependency);
    }
}

@Component(modules={MySimpleClassModule.class})
public interface MySimpleClassComponent {
}

但是我不确定每次需要创建List<String>的新实例时如何注入MySimpleClass依赖项。在上面的场景中,似乎我实际上需要将List<String>添加到MySimpleClassModule的构造函数中,并且每次需要MySimpleClass的新实例时都会有一个新模块的实例新List<String>。那是对的吗?在这种特殊情况下似乎需要很多开销。

3 个答案:

答案 0 :(得分:3)

不,不是。

我假设您遇到了 Dagger 的编译错误,因为从问题来看,您是否已经拥有提供此字符串列表的模块尚不清楚。

要修复那个,你可以简单地说:

@Module
public class MySimpleClassModule {

    @Provides
    List<String> provideListDependency() {
        return Arrays.asList("One", "Two");
    }

    @Provides
    MySimpleClass provideMySimpleClass(List<String> dependency) {
        return new MySimpleClass(dependency);
    }
}

如果您认为提供此列表应该是其他模块的一部分,您可以移动它。主要的是,编译过程中 Dagger 能够找到如何获得这种依赖。

如果您不想在此处创建此数组,可以将方法标记为@Singlethon,以便dagger将其缓存。

答案 1 :(得分:1)

如果要定义对象的构造函数,最好使用@Inject构造函数。 Dagger 2将自动知道如何实例化对象,因此您不需要在模块中使用@Provides带注释的方法。

public class MySimpleClass {

    private List<String> mDependency;

    @Inject
    public MySimpleClass (List<String> dependency) {
        mDependency = dependency;
    }
}

Dagger将假设构造函数的参数是依赖项,并尝试从依赖图中解析它们。请注意,每个类只能有一个@Inject带注释的构造函数!如果您无法自己实例化对象(例如Android活动/片段),则需要使用字段注入。

在您的情况下,似乎没有必要将空列表注入MyClass。您可以在构造函数中实例化列表。但是,当您想将MyClass注入另一个对象时,它将已经存在于对象图中。

答案 2 :(得分:0)

class A {
    String name;
    @Inject
    A(String name) {
        this.name = name;
    }


    @Component
    interface AComponent {
        A getA();
        @Component.Builder
        interface Builder {
            @BindInstance
            Builder provideName(String name);
            A build();
        }
    }