我有一个简单的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>
。那是对的吗?在这种特殊情况下似乎需要很多开销。
答案 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();
}
}