java - Dagger 字段注入(inject)不适用于简单的 java 类

标签 java dagger-2 dagger

我正在尝试使用 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/

相关文章:

android - Dagger 注入(inject)不适用于 Kotlin 中的 "object"

java - 不返回模拟值

java - 将代码部署到 Amazon EC2 实例

kotlin - Dagger 和 Kotlin 。 Dagger 不生成组件类

android - Android 上的 Dagger 2,缺少错误消息

android - CustomScope 可能不会引用具有不同范围的绑定(bind)

android - 何时在 Android 应用程序中使用 Dagger?

java - 如何在Visual Studio代码中的tinySound中加载Sound对象?

java - 有没有更好的方法来检查字符串中是否有数字?

android - Dagger 2 无法识别 Kotlin 中的提供方法。 Java 工作正常