我想将自定义类作为依赖项注入到不同的服务类中,但是我无法正常工作。它总是以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中使用BazService的@Inject

public class FooService {
    @Inject BazService bazService;

    public FooService(){}

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


由于FooSerivce类中的bazService未定义,因此运行Main.class总是在NPE中结束。我认为,我没有在任何地方添加注释。我认为Dagger不能以这种方式工作...有什么想法吗?

最佳答案

FooService希望通过字段注入来注入bazService,但是您要在此之前调用bazService。如果要在FooService的构造函数中调用bazService.doStuff(),则必须使用构造函数注入。

08-04 00:42