匕首场注入不适用于简单 java 类

Dagger field injection not working with simple java classes

我正在尝试使用 Dagger 进行字段注入,尽管构造函数注入工作得非常好,但我不知道字段注入有什么问题。可能是我做错了。我正在添加代码片段。我在 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();
    }
}

如果你想进行嵌套注入,你需要使用构造函数注入,否则这不会自动发生,因为当你提供 Dagger 样式之外的依赖项(通过构造函数注入或模块中的参数注入)时,dagger 对此一无所知。改变你的 classes 如下:

像这样改变你的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 像这样:

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 不会注入 CLASS 的领域,这不是由它自己创建的。

您正在自己创建 MarutiCar 实例,您如何期望 dagger 知道它需要什么?你可以在 class 中开始一个新的匕首创建链来实现这一点,这是一件很奇怪的事情。 您需要通过构造函数或模块方法参数显示依赖关系来告诉匕首您需要什么,以便匕首实例化它们以便您知道它们需要什么。 dagger 不提供你的嵌套依赖注入字段,因为它没有创建它们,所以它不知道它们的依赖关系,除非你像你在 App class 中所做的那样开始另一个匕首创建链。 如果您不想使用构造函数注入,还有另一种方法,我只为您展示 Car 和 MarutiCar class:

@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 class 会像这样(不需要 @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 ");        
    }

}