[英]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.