guice条件模块安装

时间:2019-05-22 07:52:28

标签: java dependency-injection guice

我在主类中有以下代码

public ABCImpl() {
    Injector injector = Guice.createInjector(new SomeModule());
    this.config = injector.getInstance(SomeConfig.class);

SomeModule中还安装了其他模块,例如

public class SomeModule extends AbstractModule {

    @Override
    protected void configure() {
        install(new SomeOtherModule());
        install(new AndAnotherModule());
    }
}

SomeOtherModule模块属于不同的jar,并且具有提供程序实现。

@ProvidesIntoOptional(ProvidesIntoOptional.Type.DEFAULT)
public XYZ getXYZ() {
    return new XYZ();
}

现在,我想在SomeModule中覆盖此默认值,或基于config中的值创建要安装的其他模块

@ProvidesIntoOptional(ProvidesIntoOptional.Type.DEFAULT)
public XYZ getXYZDifferentWay() {
    return new XYZ(someparam);
}

如何实现这一目标。我唯一的目标是,如果config上的某个值是true,那么我应该得到不同的XYZ,否则请保持原样。这在需要默认资源连接但在本地计算机中可能可以使用模拟资源的情况下很有用。

1 个答案:

答案 0 :(得分:1)

从字面上看,只需有条件地安装它们即可:

if (condition) {
  install(new SomeOtherModule());
} else {
  install(new AndAnotherModule());
}

或者,如果您希望AndAnotherModule覆盖SomeOtherModule中的绑定,请使用Modules.override

Module module = new SomeOtherModule();
if (condition) {
  module = Modules.override(module).with(new AndAnotherModule());
}
install(module);

或者,如果您想使用另一个guice绑定中的配置:

// In SomeOtherModule
@Provides @FromSomeOtherModule
public XYZ getXYZ() { ... }

// In AndAnotherModule
@Provides @FromAndAnotherModule
public XYZ getXYZ() { ... }

// In a module which "picks" between the two:
@ProvidesIntoOptional(ProvidesIntoOptional.Type.DEFAULT)
public XYZ provideBasedOnCondition(
    @SomeQualifier boolean condition,
    @FromSomeOtherModule XYZ fromSomeOtherModule,
    @FromAndAnotherModule XYZ fromAndOtherModule) {
  return condition ? fromSomeOtherModule : fromAndOtherModule;
}

其中@FromSomeOtherModule@FromAndAnotherModule@SomeQualifier是合适的绑定注释。