Dagger2 基础 - 场注入 - 不工作

Dagger2 Basics - Field Injection - Not working

我正在尝试使用 Dagger2 进行场注入。我意识到在方法注入的情况下我需要手动调用注入。我主要是想为汽车注入引擎。引擎在运行时决定,并注入。

数据是这样的

汽车界面

import dagger.Binds;

public interface Car {  

    public void run();
}

汽车实施

public class Volkswagen implements Car {

@Inject
public Engine engine;

    public void run() {
        System.out.println("About to Run");
        engine.start();
    }
}

引擎界面

public interface Engine {
    public String start();
}

引擎实现

public class Ferrari4Cylinder implements Engine {

    @Override
    public String start() {
        return "Ignition----Vroom-- Vroom-- Sweet Purring Sound";
    }
}

车载模块

public  class CarModule{
    @Provides @Singleton
    Car provideCar(){
        return new Volkswagen();
    }   
}

引擎模块

@Module
public class EngineModule {
    @Provides @Singleton
    public Engine provideEngine(){
        return new Ferrari4Cylinder();
    }
}

组件Class

@Singleton
@Component(modules = {CarModule.class, EngineModule.class})
public interface MyCarComponent {
    public Car provideCar();
    void inject(Car car);
}

主要方法

public class Main {

    public static void main(String[] args) {
        MyCarComponent carComponent= DaggerMyCarComponent.builder().build();
        Car car = carComponent.provideCar();    
        carComponent.inject(car);
        car.run();
    }
}

出于某种原因: Car.run() 方法总是 returns null,因为引擎永远不会被注入。 线程异常 "main" java.lang.NullPointerException

任何人都可以帮助解决这里发生的事情吗?

2016 年 9 月 2 日更新: 我发现以下更改组件以指向实际实现的方法如下所示。不知道为什么另一个没有,但它帮助我在这个问题上取得了进展。

@Singleton
@Component(modules = {CarModule.class, EngineModule.class})
public interface MyCarComponent {
    public Volkswagen provideCar();
    void inject(Volkswagen car);
}

希望这可以帮助人们解决 Dagger 中的字段注入问题。

您似乎忘记将 EngineModule 添加到 MyCarComponent

为了进行字段注入,您应该在 Car class 中的 Engine 上添加 @Inject 注释。但鼓励尽可能避免字段注入。而是考虑这样做:

public class Volkswagen implements Car {

  private final Engine engine;

  public Volkswagen(Engine engine) {
    this.engine = engine;
  }

}

然后在CarModule

@Provides
@Singleton
static Car provideCar(Engine engine) {
  return new Volkswagen(engine);
}

另外,这样你就不需要组件接口上的inject方法了。

记得在组件中添加EngineModule,这样dagger就可以提供一个Engine.

您需要使用@Inject 注释您的Engine 字段。我也相信你会 需要向您的注入方法提供已实现的 class(大众汽车而不只是汽车)。

public class Volkswagen implements Car {

  @Inject public Engine engine;

  public void run() {
    System.out.println("About to Run");

    engine.start();
  }
}

--

@Singleton
@Component(modules = {CarModule.class, EngineModule.class})
public interface MyCarComponent {

  public Car provideCar();
  void inject(Volkswagen car);

}