确保模块仅在Guice中加载一次

Mar*_*ten 10 java guice

必须处理Guice,我想知道我应该如何处理模块方面的依赖关系.

在Guice中,每个模块都由一个实例提供.因此,如果我有一个需要某个服务的模块,它会创建一个模块,为该服务添加一个绑定并安装它(binder.install(module)).

现在我有两个独立的模块,完全可以独立使用,并且都安装相同的数据库模块.

独立使用这两个模块没有问题,但如果两个模块在同一个应用程序中使用会发生什么?数据库模块将由两个模块独立加载,但不能正确.

有没有办法询问活页夹是否某种类型已经绑定?我无法使用getProvider来检查它,因为所有返回的都是LookupProvider,无论是否已经绑定了什么.

那么如何处理这种情况呢?

更新:

它接缝Guice无法提供以下功能:

  1. 检查给定模块是否已加载.
  2. 检查给定的类是否已绑定.
  3. 使用配置中的提供程序可以执行分布式配置(模块能够配置要提供的对象).

Tav*_*nes 13

Guice有两个功能来处理这种情况.第一个是模块重复数据删除.这意味着如果安装两个等效的模块(by equals()hashCode()),则只configure()运行一个方法.但是,这种解决方案有些脆弱,因为它无法在SPI转换中存活Modules.override(),等等.

第二个和IMO更好的解决方案是绑定重复数据删除.这意味着Guice将接受完全重复的绑定.因此,如果你的模块没有bind(Interface.class).to(Implementation.class),它的configure()方法运行两次甚至不重要,因为Guice将处理重复绑定就好了.