有了Guice,如何提供相同类型的不同实例?

时间:2015-12-11 17:24:40

标签: java dependency-injection guice

我有类型A和B.我想绑定两个类型A的实例,并提供两个类型B的实例 - 基于类型A的实例创建类型B的实例。

我尝试在下面执行此操作,但调用provideB2()会导致此异常:

A binding to javax.sql.DataSource was already configured at ...providesB1()

我想这个简单的解决方案是不提供B类的两个实例,而是让我的提供者方法返回C和D类型,两者都扩展B.但是有没有办法在提供两个实例时实现这一点B型?

@BindingAnnotation
@Retention(RetentionPolicy.RUNTIME)
@interface A1 {}

@BindingAnnotation
@Retention(RetentionPolicy.RUNTIME)
@interface A2 {}

//....

(A.class).annotatedWith(A1.class).toInstance(aInstance1);
(A.class).annotatedWith(A2.class).toInstance(aInstance2);

@Provides
@Singleton
@Inject
B providesB1(@A1 a) {
  return new B(a)
}

@Provides
@Singleton
@Inject
B providesB2(@A2 a) {
  return new B(a)
}

1 个答案:

答案 0 :(得分:2)

您已使用绑定注释PHP Warning: get_browser(): HTTP_USER_AGENT variable is not set, cannot determine user agent name in /home/insu/a.php on line 6 @A1区分了两个不同的A。您只需要将两个不同的B与绑定注释区分开来,方法是将注释添加到@A2providesB1的注释列表中。