Dagger字段注入不适用于简单的java类

时间:2017-05-21 06:00:00

标签: java dagger-2 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();
    }
}

1 个答案:

答案 0 :(得分:0)

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

像这样更改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;
    }
}

更新:不属于其自身创造的类别的D W W IN IN IN IN F F F F F F F F F F F F F F F

您正在自己创建MarutiCar实例,您如何期待匕首知道它需要什么?你可以在那个类中开始一个新的匕首创造链来实现这个,这是一个奇怪的事情。 你需要通过构造函数或模块方法参数显示依赖关系来告诉dagger你需要什么,以便dagger实例化它们以便你知道它们需要什么。 dagger没有提供嵌套的依赖注入字段,因为它没有创建它们所以它不知道它们的依赖关系,除非你启动另一个匕首创建链,就像你在App类中所做的那样。 还有另一种方法,如果你不想使用构造函数注入,我只为你显示这个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 ");        
    }

}