我对新Guice很陌生,但在此之前我已经取得了相当的成功。
我有一个'main'Guice模块(ServerModule
),如下所示,它安装了其他几个模块:
public class ServerModule extends AbstractModule {
@Override
protected void configure() {
install(new DbModule());
install(new ModuleA());
install(new ModuleB());
}
}
第一个安装的模块(DbModule)如下:
public class DbModule extends AbstractModule {
@Override
protected void configure() {
bind(DbService.class).to(DbServiceImpl.class).asEagerSingleton();
}
}
我遇到的问题是其他两个模块依赖于DbService
创建的DbModule
实例。 I.E.我需要将DbService
对象注入其他两个已安装的模块(ModuleA
和ModuleB
)。
由于ModuleA
和ModuleB
不是由注入器创建的(我正在构建它们如上所示),我无法将创建的DbService实例注入这些模块中,甚至无法将它们传递给构造函数。即:
install(new DbModule());
install(new ModuleA(dbService));
install(new ModuleB(dbService)));
我已经体验过使用提供程序@provider
来提供DbService的实例,但是由于我正在手动保管模块,如上所示,它将无法正常工作。
如果我可以让注射器创建ModuleA
和ModuleB
,我想我可以将DbService
实例注入其中,但我无法弄清楚怎么做。
有没有人对我如何才能最好地完成这项工作有任何想法?
编辑:我忘了提到@provider似乎没有用的原因是因为我需要在ModuleA本身使用DbService,而不是在其中一个绑定中使用:public class ModuleA extends AbstractModule {
@Inject
private DbService dbService;
@Override
protected void configure() {
if( dbService.getX() )
bind(Y.class);
}
}
答案 0 :(得分:2)
你不能也不应该这样做,因为Guice模块不应该以这种方式使用。
基本上,Guice鼓励将配置与实际对象创建分开。除非您创建注入器,使用它来创建新模块,然后使用这些模块创建另一个注入器,否则您无法注入模块。
事实上这非常好。你的模块里面通常不应该有复杂的逻辑,毕竟它只是一个配置。您应该重构您的程序,例如,使用@Provides
- 方法或完整的Provider
。然后,您将拥有更清晰的依赖配置逻辑。
答案 1 :(得分:2)
你做不到。
创建注射器时会调用Module.configure()方法,注射只能在注射器准备就绪后才能进行。