繁体   English   中英

Dagger2基础知识 - 现场注入 - 不工作

[英]Dagger2 Basics - Field Injection - Not working

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

数据是这样的

CarInterface

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();
    }
}

组件类

@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()方法始终返回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中的Field Injection问题。

您似乎忘了将EngineModule添加到MyCarComponent

为了进行场注入,您应该在Car类的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添加到组件中,以便匕首可以提供Engine

您需要使用@Inject注释您的引擎字段。 我也相信你需要为你的注入方法提供已实现的类(Volkswagen而不仅仅是Car)。

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);

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM