字段注入在Dagger2 Android中不起作用

时间:2019-06-12 14:47:47

标签: android dependency-injection dagger-2

我正在尝试使用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)

1 个答案:

答案 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*类所做的相同。

另外,我不知道为什么要在构造函数注入中使用字段注入,但是您也可以将依赖项移至构造函数,从而允许字段为私有。