java - 在 Guice 中提供对特定客户端的特定依赖

标签 java guice

我正在尝试绑定(bind)同一接口(interface)的两个特定实现。一个是常规服务,应该普遍使用,另一个是第一个服务的变体,它增加了缓存。后者必须仅提供给几个类,而不是常用的类。

我了解 Guice 中的所有绑定(bind),包括命名和注释绑定(bind),但它们都不适合我的场景。我不希望我的客户必须使用特定的注释或字符串值。它知道的越少越好。向其提供哪个依赖项的决定必须来自外部,即来自模块。

因此,如果命名和注释绑定(bind)消失,我只能绑定(bind)到具体实例。这是一个解决方案,因为它允许我在客户端的构造函数中提供特定的依赖关系,但我仍然发现它不是最佳的。

你会建议我做什么?

最佳答案

您的问题与需要 private modules 的问题非常相似,除了私有(private)模块绑定(bind)不能与注入(inject)器中的全局绑定(bind)冲突。表达“此绑定(bind)适用于除此其他私有(private)模块之外的任何地方”会很棘手。

当您的构造函数无法注释以单独表达依赖项时,一种方法是手动创建您的类(即包装您的构造函数)。这意味着只要构造函数发生更改,您的包装器就需要更改,但这可能不会有太大问题。

public class CachingModule extends AbstractModule {
  @Override public void configure() {}

  // You could also write and bind a full Provider<T>, but this is more concise.
  @Provides FirstClassThatNeedsCaching provideFirst(
      CachingService service, Dep2 dep2) {
    return new FirstClassThatNeedsCaching(service, dep2);
  }

  @Provides SecondInterface provideSecond(CachingService service, Dep3 dep3) {
    return new SecondClassThatNeedsCaching(service, dep3);
  }
}

关于java - 在 Guice 中提供对特定客户端的特定依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29150577/

相关文章:

java - 构造函数没有任何返回类型,但是对象是如何创建的呢?

java - 如何在Java中从另一个类实现start(Stage)方法?

java - 如何获取点击复选框所在行的ListView位置和对应的SimpleAdapter数据?

java - 模拟在测试中创建的对象内部方法

java - 在jsonpath中过滤时如何获取第一个元素?

java - 使用内置的 Guice 注入(inject)来注释静态 java.util.Logger 实例的正确习惯用法是什么?

java - 带有自定义注释的 Guice 动态注入(inject)

java - Guice Servlet 项目在启动时因 IllegalAccessException 而失败

由于我使用依赖注入(inject),Scala play 2.5 测试未运行

java - Guice 中范围注释和范围实例之间的区别