【发布时间】:2014-02-22 04:15:01
【问题描述】:
AbstractModule 类中的方法install() 有什么作用?有人可以向我解释吗?从我从 guice 网站上读到的文档中,我只能得到:
使用给定的模块来配置更多的绑定。
具体配置什么绑定?已安装模块的绑定还是调用 install 方法的类的绑定?
【问题讨论】:
AbstractModule 类中的方法install() 有什么作用?有人可以向我解释吗?从我从 guice 网站上读到的文档中,我只能得到:
使用给定的模块来配置更多的绑定。
具体配置什么绑定?已安装模块的绑定还是调用 install 方法的类的绑定?
【问题讨论】:
install 允许组合:在其configure 方法中,FooModule 可以安装 FooServiceModule(例如)。这意味着仅基于 FooModule 创建的 Injector 将在 FooModule 和 FooServiceModule 中包含绑定和提供程序。
您可能会看到install 用于将模块拆分为逻辑子模块以便于阅读或测试,或者用于高级模块以确保配置其依赖项。您还可以使用它来实例化具有不同构造函数参数的模块实例(例如绑定多个数据存储),或者安装自动生成的模块实例,例如通过 FactoryModuleBuilder 创建的模块实例。
模块组合可能是一把双刃剑,因为不允许重复绑定:如果您的 FooModule 和 BarModule 都 install 相同的依赖模块,并且绑定不是 exact duplicates(例如,如果模块实例化一个对象在其configure 方法中),由于重复绑定,Guice 将无法创建任何同时安装 FooModule 和 BarModule 的 Injector。您可以通过在您的模块上定义 equals 和 hashCode 来解决此问题,或者通过管理您的组合以使任何模块要么是顶级的,要么安装在另一个模块中(但不能同时安装)。
请参阅this archived blog 或this SO answer 了解更多关于去重绑定的信息。
【讨论】: