我正在尝试使用 dagger 进行字段注入(inject),尽管构造函数注入(inject)工作得很好,但我不知道字段注入(inject)有什么问题。也许我做错了。我正在添加代码片段。我在 engine.start() 上遇到空指针异常,因为未提供引擎依赖项。它类似于 A->B->C 依赖关系,其中 A->B 被馈送,但 B->C 不被馈送。已经很久了我无法解决。
package com.raghav.java.car;
import javax.inject.Inject;
public class App
{
@Inject
Car car;
App() {
DaggerCarComponent.create().inject(this);
}
public static void main( String[] args )
{
App app = new App();
app.perform();
}
private void perform() {
car.run();
}
}
public interface Engine {
void start();
}
class FordEngine implements Engine {
public void start() {
System.out.println("Engine started -- Vroom Vroom");
}
}
public interface Car {
void run();
}
class MarutiCar implements Car {
@Inject
Engine engine;
public void run() {
engine.start();
System.out.println("WOW!! Maruti Running ");
}
}
@Singleton
@Component(modules = {CarModule.class})
public interface CarComponent {
void inject(App app);
}
@Module
class CarModule {
@Singleton
@Provides
public Car provideCar() {
return new MarutiCar();
}
@Singleton
@Provides
public Engine provideEngine() {
return new FordEngine();
}
}
最佳答案
如果你想进行嵌套注入(inject),你需要使用构造函数注入(inject),否则这不会自动发生,因为当你提供 Dagger 样式之外的依赖项时(通过模块中的构造函数注入(inject)或参数注入(inject)),Dagger 对此一无所知。更改您的类(class),如下所示:
像这样更改您的MarutiCar
:
class MarutiCar implements Car {
Engine engine;
@Inject
public MarutiCar(Engine engine)
{
this.engine = engine;
}
public void run() {
engine.start();
System.out.println("WOW!! Maruti Running ");
}
}
以及您的 FordEngine
类,如下所示:
class FordEngine implements Engine {
@inject
public FordEngine()
{
}
public void start() {
System.out.println("Engine started -- Vroom Vroom");
}
}
然后更改您的CarModule
,如下所示:
@Module
class CarModule {
@Singleton
@Provides
public Car provideCar(MarutiCar marutiCar) {
return marutiCar;
}
@Singleton
@Provides
public Engine provideEngine(FordEngine fordEngine) {
return fordEngine;
}
}
更新:DAGGER 不会注入(inject)不是由其自身创建的类的字段。
您正在自己创建 MarutiCar 实例,您如何期望 dagger 知道它需要什么?您可以在该类中开始一个新的 Dagger 创建链来实现这一点,这是一件奇怪的事情。
您需要通过构造函数或模块方法参数显示依赖关系来告诉 dagger 您需要什么,以便 dagger 实例化它们以便您知道它们需要什么。 dagger 不提供嵌套依赖项注入(inject)字段,因为它尚未创建它们,因此它不知道它们的依赖项,除非您像在 App
类中所做的那样启动另一个 dagger 创建链。
如果您不想使用构造函数注入(inject),还有另一种方法,我只向您展示 Car 和 MarutiCar 类:
@Module
class CarModule {
@Singleton
@Provides
public Car provideCar(Engine engine) {
MarutiCar marutiCar = new MarutiCar(engine);
}
@Singleton
@Provides
public Engine provideEngine(FordEngine fordEngine) {
return fordEngine;
}
}
MarutiCar 类就像这样(不需要 @inject)
class MarutiCar implements Car {
Engine engine;
public MarutiCar(Engine engine)
{
this.engine = engine;
}
public void run() {
engine.start();
System.out.println("WOW!! Maruti Running ");
}
}
关于java - Dagger 字段注入(inject)不适用于简单的 java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44093671/