我正在尝试使用dagger。到目前为止,我所了解的是将依赖项注入一个类中,我们首先需要匕首如何通过Modules或Constructor注入创建该依赖项,然后使用Components方法使用该依赖项。 / p>
这是我正在尝试的示例代码
战争等级取决于House1和House2
战争阶级
public class War {
@Inject House1 house1;
@Inject House2 house2;
public void startWar(){
house1.prepareForWar();
house1.reportForWar();
house2.prepareForWar();
house2.reportForWar();
System.out.println("House1 is "+house1);
}
}
House1班
public class House1 implements House {
@Inject
public House1() {
}
@Override
public void prepareForWar() {
System.out.println("House1 Prepared for War");
}
@Override
public void reportForWar() {
System.out.println("House1 reported for War");
}
}
House2类
public class House2 implements House {
@Inject
public House2() {
}
@Override
public void prepareForWar() {
System.out.println("House2 prepared for war");
}
@Override
public void reportForWar() {
System.out.println("House2 reported for War");
}
}
WarModule类
@Module
public class WarModule {
@Provides
public War provideWarObject(){
return new War();
}
}
组件类
@Component(modules = {WarModule.class})
public interface HouseComponent {
War getWar();
}
主类
public class TempMain {
public War war;
public void startWar(){
war = DaggerHouseComponent.builder().warModule(new WarModule()).build().getWar();
war.startWar();
}
}
这里Dagger知道如何通过WarModule使用构造函数和War对象创建House1和House2。
因此在战争类中,使用@Inject House1和@Inject House2时,匕首应该注入它,因为它知道如何创建这些依赖项。 但是我在这里得到了空指针异常
错误: 线程“主”中的异常java.lang.NullPointerException 在com.gosemathraj.dagger2.java.models.war.War.startWar(War.java:14)
答案 0 :(得分:1)
因此在战争类中,使用@Inject House1和@Inject House2时,匕首应该注入它,因为它知道如何创建这些依赖项。但是我在这里得到了空指针异常
Dagger不会执行任何操作,因为您在此处创建对象:
@Provides
public War provideWarObject(){
return new War();
}
如果使用带@Provides注释的方法,则需要先设置对象,然后再返回它。 Dagger仅会注入它创建的对象或您调用component.inject(object)
的对象。
简单的解决方案是删除@Provides
的注释方法,并将@Inject public War() {}
添加到您的类中。然后Dagger可以创建对象,然后将其注入,这与您为House*
类所做的相同。
另外,我不知道为什么要在构造函数注入中使用字段注入,但是您也可以将依赖项移至构造函数,从而允许字段为私有。