java - 使用Guice,如何提供同一类型的不同实例?

标签 java dependency-injection guice

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

我尝试在下面执行此操作,但对 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)
}

最佳答案

您已经通过绑定(bind)注释 @A1@A2 区分了两个不同的 A。您只需要通过绑定(bind)注释来区分两个不同的 B,只需将您的注释添加到 providesB1providesB2 的注释列表中即可。

关于java - 使用Guice,如何提供同一类型的不同实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34229120/

相关文章:

Java 构造函数注入(inject)

java - 在运行时更改 guice 实例的值

asp.net-core - 如何通过他们的界面自动注册/解决服务?

c# - 您如何使用 StructureMap v2.6 解析 signalR v2.0

dependency-injection - Actor 中的 WebSocket.acceptWithActor 和 @Inject() (Play 2.5)

google-app-engine - 如何在 GAE 的 sitebricks 方法中注入(inject)请求范围的 HttpSession?

java - 将 getLatitude() 分配给变量时出现问题

java - zip文件太大aws lambda java gradle

Java contains() 与 equals() 不符

java - HK2 类型文字和通配符