使用Guice设置属性的正确方法是什么?

时间:2010-12-28 11:08:36

标签: java dependency-injection guice

假设我们有两个类 - MainMainDependency。第二个类仅由Main使用,使用IoC的目的是构建Main类的实例。

MainDependency类有一个整数类型的字段。不需要设置该字段(或者,如果没有指定其他内容,我们假设它应该始终具有默认值。)

问题:设置整数字段的最正确方法是什么?我看到的一种方法是在Module内创建类似的字段,然后在configure模块中使用该值。但我觉得这是一种错误的方式。

请分享您的经验。 Thx提前。

1 个答案:

答案 0 :(得分:2)

我认为你主要有两种选择:

1)使用常量绑定注入它。 MY_CONSTANT的值可以在实例化时传递给Module;可以从系统属性中获取,也可以采用其他方式。

class MainDependency{
  @Inject
  public MainDependency(@Named("myConst") int myConst){
    //...
  }
}

class Module extends AbstractModule{
  public void configure(){
    bindConstant().annotatedWith(Names.named("myConst").to(MY_CONSTANT);
  }
}

2)使用辅助注入创建一个工厂,它将您的值作为参数并返回MainDependency的实例:

interface MainDependencyFactory{
  MainDependency create(int myConst);
}

class MainDependency{
  @Inject
  public MainDependency(@Assisted int myConst){
    //..
  }
}

class Module extends AbstractModule{
  public void configure(){
    bind(MainDependencyFactory.class).toProvider(
      FactoryProvider.newFactory(MainDependencyFactory.class, MainDependency.class));
  }
}

//to use the above, instantiate your factory (or inject it somewhere)
MainDependencyFactory f = injector.getInstance(MainDependencyFactory.class);
//Then you can create MainDependency with any value
MainDependency md = f.create(MY_CONSTANT);

请注意,使用辅助注射时,您无需实施MainDependencyFactory。 Guice会为你创造它。