Java Guice - 在Spring中创建多个'beans'的guice等效方法吗?

And*_*ius 1 java spring dependency-injection guice

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

bind(Triangle.class).to(IsoTriangle.class);
bind(Triangle.class).toInstance(new Triangle(6));
Run Code Online (Sandbox Code Playgroud)

我收到错误:

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);
Run Code Online (Sandbox Code Playgroud)

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

我读到有这样的事情:

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"));
          }
        });
  }
Run Code Online (Sandbox Code Playgroud)

但它看起来更像是一个技巧/黑客(你需要在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>
Run Code Online (Sandbox Code Playgroud)

nhu*_*nhu 5

更新:反映给定的例子

在你的模块中:

bind(Triangle.class)
  .annotatedWith(Names.named("triangle1")
  .toInstance(new Triangle(6));
bind(Triangle.class)
  .annotatedWith(Names.named("triangle2")
  .toInstance(new Triangle(5));
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中:

@Inject
public void setTriangle
  (@Named("triangle1")Triangle triangle){
  this.triangle = triangle;
}
Run Code Online (Sandbox Code Playgroud)