java - 如何为 Google Guice 中的特定类型分配默认的 'fallback' 提供程序

标签 java guice

我的用例是这样的:

对象请求特定类型的未绑定(bind)@Named 注入(inject)。我希望 Guice 告诉我的“回退”提供者名称值是什么(或给我整个注释),这样我的提供者仍然可以提供基于名称值的实现。

@Named 值因此用作在运行时查找正确实现的键。如果根据@Named 找到实现,则不应咨询提供者。

最佳答案

Guice 基本上是一个从(注释,类型)元组到 Provider<T> 的映射.没有办法将默认绑定(bind)绑定(bind)到所有未绑定(bind)的 @Named实例比将整个 double 范围绑定(bind)到 Map<Double, String> 中的单个字符串要好得多。 .

如果你有一个方便的数组或所有 @Named 的集合你想要的值,你可以遍历它们并将它们全部绑定(bind)到某种默认提供程序,然后你可以使用 Modules.override() 进行破解或 if循环内的 block :

public class DefaultNameModule extends AbstractModule() {
  @Override public void configure() {
    for (String name : YOUR_LIST_OF_NAMES) {
      if (properties.contains(name)) {
        bindConstant(properties.get(name)).annotatedWith(Names.named(name));
      } else {
        bind(Foo.class)
            .annotatedWith(Names.named(name))
            .toProvider(new MyProvider(name));
      }
    }
  }

  private static class MyProvider extends Provider<Foo> {
    final String name;

    MyProvider(String name) {
      this.name = name;
    }

    @Override public Foo get() {
      return someValueBasedOn(name);
    }
  }
}

如果这对您来说太复杂了,请记住您始终可以注入(inject)一个包装了 Properties 的单方法对象的实例。为您访问,在需要时计算默认值。

关于java - 如何为 Google Guice 中的特定类型分配默认的 'fallback' 提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14416085/

相关文章:

java - 在没有其他模块提供该实例的情况下提供实例

java - SQLite JDBC中无需重复列即可实现全外连接效果

java - 在 Eclipse/Gradle/Java 项目中,项目名称和根项目目录如何具有不同的名称?

java - 为什么我的类构造函数被重复调用?

java - NotFound 无法转换为 Throwable

java - Android 应用程序抛出 Guice 异常

java - 嵌入式 Jetty 处理 URL 来提供内容

Java Guice - toProvider 方法不适用于参数

java - 将父类(super class)类型转换为子类类型?

java - Java 中的应用程序范围的方法拦截器