【问题标题】:Java Guice - guice equivalent way to create multiple 'beans' like in Spring?Java Guice - 像在 Spring 中一样创建多个“bean”的 guice 等效方法?
【发布时间】:2013-12-23 14:20:00
【问题描述】:

Guice 是否有办法让我简单地创建具有不同值/参数的多个对象/bean? 例如,假设我有Triangle 类,我想在配置中创建多个三角形,一个带有参数lengh = 6,一个带有length = 5,另一个完全没有参数。 如果我尝试这样的事情:

bind(Triangle.class).to(IsoTriangle.class);
bind(Triangle.class).toInstance(new Triangle(6));

我得到错误:

A binding to test.Triangle was already configured at test.Configuration.configure(Configuration.java:14). at test.Configuration.configure(Configuration.java:15)

如果我尝试在 main 方法中调用两个 Triangle 实例,例如:

Triangle tr = injector.getInstance(Triangle.class);
Triangle tr2 = injector.getInstance(Triangle.class);

第二个实例被忽略,因为我没有看到它被第二次使用。

我读到有这样的事情:

class LegModule extends PrivateModule {
  private final Class<? extends Annotation> annotation;

  LegModule(Class<? extends Annotation> annotation) {
    this.annotation = annotation;
  }

  @Override protected void configure() {
    bind(Leg.class).annotatedWith(annotation).to(Leg.class);
    expose(Leg.class).annotatedWith(annotation);

    bindFoot();
  }

  abstract void bindFoot();
}
  public static void main(String[] args) {
    Injector injector = Guice.createInjector(
        new LegModule(Left.class) {
          @Override void bindFoot() {
            bind(Foot.class).toInstance(new Foot("leftie"));
          }
        },
        new LegModule(Right.class) {
          @Override void bindFoot() {
            bind(Foot.class).toInstance(new Foot("righty"));
          }
        });
  }

但它看起来更像是一个技巧/黑客(你需要在 main 方法中做这种事情吗?就像在春天你根本不需要在 main 中做任何事情。但我认为这些框架的想法是很不一样)。 Guice 是否有更简单的方法来做到这一点,或者 Guice 的目的是将所有内容绑定到一个实例并且不让创建多个相同类型的对象?..

更新 在春天,它是直截了当的: 例如,要创建多个三角形,我可以这样做:

<bean id="triangle1" 
    class="test.Triangle"
    >
    <constructor-arg type="int" value="6"/>
</bean>

<bean id="triangle2" 
    class="test.Triangle"
    >
    <constructor-arg type="int" value="5"/>
</bean>

【问题讨论】:

  • 你能写下你在春天会做什么吗?可能有助于了解您想要什么。
  • 参见code.google.com/p/google-guice/wiki/InjectingProviders 它向您展示了如何获取相同类型的多个实例。但它并没有告诉你如何获取多个不同的实例。
  • @ArnaudDenoyelle 所以我需要创建某种创建多个实例的方法?所以每次我想添加/删除实例时,我都需要修改那个方法?

标签: java spring dependency-injection guice


【解决方案1】:

更新:反映给定的例子

在你的模块中:

bind(Triangle.class)
  .annotatedWith(Names.named("triangle1")
  .toInstance(new Triangle(6));
bind(Triangle.class)
  .annotatedWith(Names.named("triangle2")
  .toInstance(new Triangle(5));

然后在你的代码中类似:

@Inject
public void setTriangle
  (@Named("triangle1")Triangle triangle){
  this.triangle = triangle;
}

【讨论】:

  • 感谢这很有用,尽管它不像 Spring 那样漂亮:)
  • 应该还有另一个 setTriangle 名称为"triangle2" 对吗?
  • 对,或者你可以直接注释字段或构造函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多