我正在尝试使用Dagger2进行字段注入。我意识到我需要手动调用注入,以防方法注入。我主要是想给一辆汽车注入发动机。引擎在运行时决定,并注入。
数据是这样的
CarInterface
import dagger.Binds;
public interface Car {
public void run();
}Car实施
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中的异常
有人能帮忙了解这里发生的事吗?
更新9/02/2016 :我发现以下更改组件指向实际实现工作如下所示。不知道为什么另一个没有,但它帮助我在这个问题上取得进展。
@Singleton
@Component(modules = {CarModule.class, EngineModule.class})
public interface MyCarComponent {
public Volkswagen provideCar();
void inject(Volkswagen car);
}希望这能帮助人们解决Dagger的现场注射问题。
发布于 2017-02-08 01:10:25
您似乎忘了将EngineModule添加到MyCarComponent中。
为了进行字段注入,您应该在@Inject类中的Engine上添加Engine注释。但鼓励尽可能避免现场注射。相反,可以考虑这样做:
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。
发布于 2017-02-08 16:50:14
您需要用@Inject对引擎字段进行注释。我还认为,您需要为您的注入方法提供已实现的类(大众汽车,而不仅仅是汽车)。
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);
}https://stackoverflow.com/questions/42088929
复制相似问题