【问题标题】:Does guice MapBinder expose binding key for injection?guice MapBinder 是否公开绑定密钥以进行注入?
【发布时间】:2016-10-21 17:15:24
【问题描述】:

假设我有水果类

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 将我绑定到的标签(Type.ORANGEType.APPLE)注入 Fruit 本身?所以我会:

mapBinder.addBinding(Type.ORANGE).to(Fruit.class);
mapBinder.addBinding(Type.APPLE).to(Fruit.class);

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

这可能吗?

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

但是factories.get(type).create(type); 有点味道。

【问题讨论】:

    标签: java dependency-injection guice


    【解决方案1】:

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

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

    但相同的实例将在多个注入的地图之间共享,这可能会导致问题。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多