使用 Guice,如何提供相同类型的不同实例?
With Guice, how to provide different instances of the same Type?
我有类型 A 和类型 B。我想绑定两个类型 A 的实例,并提供两个类型 B 的实例 - 类型 B 的实例是基于类型 A 的实例创建的。
我尝试在下面执行此操作,但对 providesB2() 的调用导致此异常:
A binding to javax.sql.DataSource was already configured at ...providesB1()
我想象一个简单的解决方案是不提供类型 B 的两个实例,而是让我的提供者方法 return 类型 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)
}
您已经通过绑定注释 @A1
和 @A2
区分了两个不同的 A。您只需要通过将您的注释添加到 providesB1
和 providesB2
.
的注释列表中来区分两个具有绑定注释的不同 B
我有类型 A 和类型 B。我想绑定两个类型 A 的实例,并提供两个类型 B 的实例 - 类型 B 的实例是基于类型 A 的实例创建的。
我尝试在下面执行此操作,但对 providesB2() 的调用导致此异常:
A binding to javax.sql.DataSource was already configured at ...providesB1()
我想象一个简单的解决方案是不提供类型 B 的两个实例,而是让我的提供者方法 return 类型 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)
}
您已经通过绑定注释 @A1
和 @A2
区分了两个不同的 A。您只需要通过将您的注释添加到 providesB1
和 providesB2
.