下面是我的模块类
public class ABCModule extends AbstractModule {
@Override
protected void configure() {
install(new JpaPersistModule(Configuration.get("error-persister")));
bind(DBService.class).to(DBServiceImpl.class).in(Singleton.class);
bind(DBRepository.class).to(DBRepositoryImpl.class).in(Singleton.class);
}
@ProvidesIntoOptional(ProvidesIntoOptional.Type.ACTUAL)
public ErrorHandler getErrorHandler() {
return new ABCHandler();
}
}
而ABCHandler有
private final DBService dbService;
@Inject
public ABCHandler() {
Injector injector = Guice.createInjector(new ABCModule());
injector.getInstance(PersistenceInitializer.class);
this.dbService = injector.getInstance(DBService.class);
}
@Override
public void handle() {
dbService.store("abc");
}
ABCModule
实例被创建并传递给某个通用模块。如您所见,ABCModule
提供了ABCHandler
,ABCHandler
再次使用ABCModule
创建了注入程序和服务实例。它有效,但是我知道这是不正确的。 Module
被调用了两次。如何在dbService
内注入ABCHandler
,而不必使用注入器或创建模块实例。我不想创建一个虚拟的空模块只是为了创建实例。你能建议一下吗?如果我仅在@Inject
上使用dbService
而不使用注入器,则它为null。我在Provider
内使用Module
,可以为dbService
做类似的事情。或其他解决方案?
答案 0 :(得分:2)
DbService
已经可以注射,您可以通过getErrorHandler
方法传递
@ProvidesIntoOptional(ProvidesIntoOptional.Type.ACTUAL)
public ErrorHandler getErrorHandler(DBService dbService) {
return new ABCHandler(dbService);
}
在这种情况下,ABCHandler
构造函数可以更改为此
@Inject
public ABCHandler(DBService dbService) {
this.dbService = dbService;
}
更多详细信息,请点击这里 Accessing Guice injector in its Module?