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