使用Dagger 2的多个服务类中的一个依赖项

时间:2017-11-20 16:48:41

标签: java dagger

我想在不同的服务类中注入一个自定义类作为依赖项,但我不能让它工作。它始终以NPE结束。这是我的例子(简单的Java SE)......

我的主要课程让一切正常运行

    public class Main {
        public static void main(String[] args) throws IOException, TimeoutException {
            MyApplication MyApp = new MyApplication();
            MyApp.execute();
        }
    }

MyApplication类

public class MyApplication {

    private MyApplicationComponent appComponent;

    @Inject FooService fooService;
    @Inject BarService barService;
    @Inject BazService bazService;

    public MyApplication() {
        component = DaggerMyApplicationComponent.builder().build();
        component.inject(this);
    }

    public void execute() {
        fooService.doStuff();
        barService.doStuff();

        // this will happen in the FooService construct, see below        
        // bazService.doStuff();
    }
}

Dagger中定义的组件和模块类,不使用@Inject构造函数方式

@Singleton
@Component(modules = {MyApplicationModule.class})
public interface MyApplicationComponent {
    void inject(MyApplication application);
}

@Module
public class MyApplicationModule {
    @Singleton
    @Provides
    FooService provideFooService() {
        return new FooService();
    }

    @Singleton
    @Provides
    BarService provideBarService() {
        return new BarService();
    }

    @Provides
    BazService provideBazService() {
        return new BarService();
    }
}

使用MyApplicationModule和MyApplicationComponent提供所需的依赖项可在Main.class中使用。我还想在FooService类中使用BazService。因此,我使用@Inject方式将其定义为与FooService.class的依赖关系。

在FooService.class中使用@Inject的BazService

public class FooService {
    @Inject BazService bazService;

    public FooService(){}

    public doStuff(){
        bazService.doStuff();
    }
}

由于FooSerivce类中未定义的bazService,运行Main.class始终在NPE内结束。我不认为,我错过了在任何地方添加注释。我认为Dagger不会这样工作......任何想法?

1 个答案:

答案 0 :(得分:0)

FooService希望通过字段注入注入bazService,但是在这种情况发生之前你正在调用bazService。如果你想在FooService的构造函数中调用bazService.doStuff(),你将不得不使用构造函数注入。