Java 如何使用dagger 2注入pojo依赖项?
我有一个简单的pojo类:Java 如何使用dagger 2注入pojo依赖项?,java,android,dagger-2,Java,Android,Dagger 2,我有一个简单的pojo类: public class MySimpleClass { private List<String> mDependency; public MySimpleClass (List<String> dependency) { mDependency = dependency; } } 公共类MySimpleClass{ 私有列表依赖性; 公共MySimpleClass(列表依赖项){ mdepende
public class MySimpleClass {
private List<String> mDependency;
public MySimpleClass (List<String> dependency) {
mDependency = dependency;
}
}
公共类MySimpleClass{
私有列表依赖性;
公共MySimpleClass(列表依赖项){
mdependence=依赖性;
}
}
我正在尝试使用dagger 2的依赖注入创建它。现在我有一个简单的模块和组件:
@Module
public class MySimpleClassModule {
@Provides
MySimpleClass provideMySimpleClass(List<String> dependency) {
return new MySimpleClass(dependency);
}
}
@Component(modules={MySimpleClassModule.class})
public interface MySimpleClassComponent {
}
@模块
公共类MySimpleClassModule{
@提供
MySimpleClass提供MySimpleClass(列表依赖项){
返回新的MySimpleClass(依赖项);
}
}
@组件(模块={MySimpleClassModule.class})
公共接口MySimpleClassComponent{
}
但我不确定每次需要创建
MySimpleClass
的新实例时如何注入列表
依赖项。在上面的场景中,似乎我实际上需要将List
添加到MySimpleClassModule
的构造函数中,并且每当我需要一个带有新List
的mysimpleclasss
的新实例时,都需要该模块的一个新实例。对吗?在这种特殊情况下,似乎会有很多开销。如果要定义对象的构造函数,最好使用@Inject
构造函数。Dagger 2将自动知道如何实例化该对象,这样您就不需要在模块中提供带注释的方法
public class MySimpleClass {
private List<String> mDependency;
@Inject
public MySimpleClass (List<String> dependency) {
mDependency = dependency;
}
}
公共类MySimpleClass{
私有列表依赖性;
@注入
公共MySimpleClass(列表依赖项){
mdependence=依赖性;
}
}
Dagger将假定构造函数的参数是依赖项,并尝试从依赖关系图中解析它们。请注意,每个类只能有一个带注释的构造函数!如果您自己无法实例化对象(例如Android活动/片段),则需要使用字段注入
在您的情况下,似乎没有必要将空列表注入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);
}
}
@模块
公共类MySimpleClassModule{
@提供
列表provideListDependency(){
返回数组。asList(“一”、“二”);
}
@提供
MySimpleClass提供MySimpleClass(列表依赖项){
返回新的MySimpleClass(依赖项);
}
}
如果您认为提供此列表应该是另一个模块的一部分,您可以移动它。最重要的是,在编译过程中,Dagger能够找到如何获得这种依赖性
如果你不想在上面创建这个数组,你可以将这个方法标记为
@Singlethon
,这样dagger就会缓存它。谢谢,但我认为这并不能真正解决问题。在您的方法中,我现在必须声明一种方法来“提供”我的列表
依赖项,比如在模块中。因此,每当我需要一个新的MySimpleClass
实例时,我仍然需要实例化一个新模块。现在,如果我按照您的建议更改它,我会得到“错误:java.util.Collection不能在没有@Provides注释方法的情况下提供。”就像我说的,您实际上不需要插入列表。只需在对象内部实例化它public类MySimpleClass{private List mDependency;@Inject public MySimpleClass(){mDependency=new ArrayList();}}}
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();
}
}