如何让一个Guice模块使用另一个Guice模块?

39
假设我有一个名为ProdModule的Guice模块,我想依赖于其他Guice模块,例如ProdDbModule和ProdPubSubModule。我该如何实现ProdModule的configure()方法呢?
3个回答

57

您需要安装其他模块。

protected void configure(){
    install(new ProdDbModule());
    install(new ProdPubSubModule());
    // etc.
}

33
尽管使用install非常方便,但只要在创建Injector时提供所有必需的模块,就不需要install其他模块:
Injector injector = Guice.createInjector(new ProdDbModule(),
    new ProdPubSubModule(), new ProdModule());

这样您就可以更灵活地更改入口点类中的任意一个模块,而无需修改ProdModule本身。您还可以在模块中使用requireBinding方法指示其需要其他模块提供哪些绑定。


11

您可以使用 Modules.combine 来创建一个包含所有其他模块的新模块。(请参见此链接

不同之处:

  • 这不受像install()这样的紧密耦合模块的限制。
  • 这创建了一个Module而不是一个注入器,这意味着您可以轻松地向注入器添加不同的模块。

代码

import com.google.inject.util.Modules;
Module module = Modules.combine(new ProdDbModule(),
  new ProdPubSubModule(), new ProdModule());
Injector injector = Guice.createInjector(module);

那么,相对于简单地调用 Guice.createInjector(new ProdDbModule(), new ProdPubSubModule(), new ProdModule()),有什么区别呢? - Óscar López
4
如果您想在多个地方共享相同的模块列表,并且可能需要一个模块树而不是列表,那么组合是非常有用的。但如果您只想使用单独的模块,则不需要使用组合。 - Alexander Oh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接