下面是我的模块类
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
被调用两次。如何在不使用注入器或创建模块实例的情况下在ABCHandler
中注入dbService
。我不想仅仅为了创建实例而创建一个虚拟的空模块。你能建议一下。如果我只在dbService
上使用@Inject
而不使用注入器,那么它就是null。我在Module
中使用Provider
,可以为dbService
做类似的事情吗?或任何其他解决方案?
发布于 2019-05-08 20:17:37
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?
https://stackoverflow.com/questions/56039552
复制相似问题