使用Guice多次绑定到同一个提供程序实例

时间:2012-03-15 13:19:21

标签: java dependency-injection guice

我有两个接口A和B,B正在扩展A.

我有一个提供程序能够提供其Class正在实现B(以及A)的实例。

我想将Provider绑定到B.class(直接),并在单例范围内使用Annotation绑定到A.class。

bind(B.class).toProvider(MyBImplProvider.class).in(Scopes.SINGLETON);
bind(A.class).annotatedWith(Names.named("B")).toProvider(MyBImplProvider.class).in(Scopes.SINGLETON);

如果我通过B.class或通过A.class + Annotation注入,如何从提供者返回相同的实例。例如,我希望能够将构造定义为

@Inject
C(B param)

@Inject
C(@Named("B") param)

在这两种情况下,我都希望用相同的单身人士来评估param。

1 个答案:

答案 0 :(得分:3)

如何让您的A提供商依赖于您在上面定义的B提供商?

@Provides 
@Named("B")
A provideA(Provider<B> bProvider) {
  return bProvider.get();
}

这应该有效,因为你说B扩展了A.你可能需要使用@Named位。

另一种选择是使用toInstance(yourObject)绑定。但这会使任何依赖项注入该对象变得混乱。您必须使用Binder#requestInjection()