我想将自定义类作为依赖项注入到不同的服务类中,但是我无法正常工作。它总是以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(),则必须使用构造函数注入。