【问题标题】:Multiple bindings to the same provider instance with Guice使用 Guice 将多个绑定到同一个提供程序实例
【发布时间】:2012-03-15 13:19:20
【问题描述】:

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

我有一个提供者能够提供实例,其类正在实现 B(因此是 A)。

我想将 Provider 绑定到 B.class(直截了当)和 A.class 在单例范围内使用 Annotation。

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)

在这两种情况下,我都希望使用相同的单例对参数进行评估。

【问题讨论】:

    标签: java dependency-injection guice


    【解决方案1】:

    让你的 A 提供者依赖于你上面定义的 B 提供者怎么样?

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

    这应该可以工作,因为您说 B 扩展了 A。您可能需要使用 @Named 位。

    另一种选择是使用toInstance(yourObject) 绑定。但这使得将任何依赖项注入该对象变得很麻烦。你必须使用Binder#requestInjection()

    【讨论】:

    • 我没有。 Guice 会注入 Provider 吗?
    • 会的。尝试一下? (该方法必须在 Guice 模块上进行,请参阅@Provides methods
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多