guice MapBinder是否公开了注入的绑定密钥?

时间:2016-10-21 17:15:25

标签: java dependency-injection guice

假设我有课程水果

class Fruit extends FruitBase {
  @Inject Fruit(Type type) {...}   
}

FruitBase通过方法注入注入一些东西,所以Fruit也必须通过Guice注入。

现在我需要在另一个类中注入Map<Type, Fruit>。所以我创建了一个MapBinder。最简单的方法是为每种类型创建一些Fruit的子类:

class Orange extends Fruit {
  @Inject Orange() {
    super(Type.ORANGE);
  }
}

// and later
mapBinder.addBinding(Type.ORANGE).to(Orange.class);

但是,如果我不想创建一堆简单的子类,而是让MapBinder将标签I(#{1}},Type.ORANGE)绑定到Fruit本身?所以我会:

Type.APPLE

然后我注入的Map将有两个Fruit实例:一个是ORANGE类型,另一个是APPLE。

这可能吗?

我在这里找到了一个解决方法:https://groups.google.com/d/msg/google-guice/m-m9LiVsgSM/pKVi2EIILCsJ

但是mapBinder.addBinding(Type.ORANGE).to(Fruit.class); mapBinder.addBinding(Type.APPLE).to(Fruit.class); 只是闻起来有点气味。

1 个答案:

答案 0 :(得分:2)

您可以使用绑定到预先创建的实例。请注意,在这种情况下,稍后将注入不是由这些实例的注入器成员创建的实例。

mapBinder.addBinding(Type.ORANGE).toInstance(new Fruit(Type.ORANGE));
mapBinder.addBinding(Type.APPLE).toInstance(new Fruit(Type.APPLE));

但是,几个注入的地图之间会共享相同的实例,这会导致问题。