如何使用匕首 2 注入 pojo 依赖项?
How to inject pojo dependencies using dagger 2?
我有一个简单的 pojo class:
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 {
}
但我不确定每次需要创建 MySimpleClass
的新实例时如何注入 List<String>
依赖项。在上面的场景中,似乎我实际上需要将 List<String>
添加到 MySimpleClassModule
的构造函数中,并且每次我需要 MySimpleClass
的新实例时都有一个该模块的新实例新 List<String>
。那是对的吗?在这种特殊情况下,开销似乎很大。
如果要定义对象的构造函数,最好使用 @Inject
构造函数。 Dagger 2 会自动知道如何实例化对象,因此您不需要 @Provides
模块中的注释方法。
public class MySimpleClass {
private List<String> mDependency;
@Inject
public MySimpleClass (List<String> dependency) {
mDependency = dependency;
}
}
Dagger 会假定构造函数的参数是依赖项,并尝试从依赖图中解析它们。请注意,每个 class 只能有一个 @Inject
带注释的构造函数!如果您不能自己实例化对象(例如 Android Activities/Fragments),则需要使用字段注入。
在您的情况下,似乎没有必要将空列表注入 MyClass
。您可以在构造函数中实例化列表。但是,当您想将 MyClass
注入另一个对象时,它已经在对象图中了。
不,不是。
我假设您遇到了 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 就会缓存它。
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();
}
}
我有一个简单的 pojo class:
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 {
}
但我不确定每次需要创建 MySimpleClass
的新实例时如何注入 List<String>
依赖项。在上面的场景中,似乎我实际上需要将 List<String>
添加到 MySimpleClassModule
的构造函数中,并且每次我需要 MySimpleClass
的新实例时都有一个该模块的新实例新 List<String>
。那是对的吗?在这种特殊情况下,开销似乎很大。
如果要定义对象的构造函数,最好使用 @Inject
构造函数。 Dagger 2 会自动知道如何实例化对象,因此您不需要 @Provides
模块中的注释方法。
public class MySimpleClass {
private List<String> mDependency;
@Inject
public MySimpleClass (List<String> dependency) {
mDependency = dependency;
}
}
Dagger 会假定构造函数的参数是依赖项,并尝试从依赖图中解析它们。请注意,每个 class 只能有一个 @Inject
带注释的构造函数!如果您不能自己实例化对象(例如 Android Activities/Fragments),则需要使用字段注入。
在您的情况下,似乎没有必要将空列表注入 MyClass
。您可以在构造函数中实例化列表。但是,当您想将 MyClass
注入另一个对象时,它已经在对象图中了。
不,不是。
我假设您遇到了 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 就会缓存它。
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();
}
}