Dagger字段注入不适用于简单的Java类 [英] Dagger field injection not working with simple java classes

查看:68
本文介绍了Dagger字段注入不适用于简单的Java类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用匕首进行字段注入,尽管构造函数注入工作得很好,但是我不知道字段注入有什么问题。可能是我做错了。我正在添加代码段。我在engine.start()上收到空指针异常,因为未提供引擎依赖项。它类似于A-> B-> C依赖项,其中A-> B被提供,而B-> C不被提供。很久以来我无法解决。

I am trying field injection with dagger although constructor injection is working absolutely fine but i don't know what is wrong with field injection. May be I am doing wrong. I am adding the code snippets. I am getting null pointer exception on engine.start() because the engine dependency is not fed. It is similar to A->B->C dependencies where A->B is fed but B->C is not. Its been long I am unable to resolve.

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对此一无所知。像下面这样更改课程:

if you want to do nested injection you need to use constructor injection otherwise that wont happen automatically because when you provide a dependency out of Dagger style (through constructor injection or argument injection in module) dagger has no idea about that. change your classes like below:

像这样更改您的 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 WONT注射了一个类的字段不是自己创造的。

UPDATE: DAGGER WONT INJECT FIELDS OF A CLASS THAT IS NOT CREATED BY ITSELF.

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

you are creating the MarutiCar instance by your self how you expect dagger to know what it needs ? you can start a new chain of dagger creation in that class to achieve this which is a weird thing to do. you need to tell dagger what you need by showing dependencies through constructor or module method argument so that dagger instantiate them for you to know what they need. dagger doesnt provide your nested dependencies injected fields because it hasnt created them so it has no idea about their dependencies, unless you start another chain of dagger creation like what you did in your App class. there is another way if you dont want to use constructor injection which i only show this for you Car and 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类就像这样(不需要

and the MarutiCar class would be like this (no need for @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 ");        
    }

}

这篇关于Dagger字段注入不适用于简单的Java类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆