2

语境

我想使用 Guice 自动注入配置项。我的配置框架是 typesafe 的配置。

public class MyObject {
  @Configuration("value") int value;
}

为此,我写了一个注释。

// Annotations skipped, but correct
public @interface Configuration {
  String value();
}

我写了一个模块。这个模块检查所有类型的注入,然后允许注入本身。

public class ConfigurationModule extends AbstractModule {
  @Override protected void configure() {
    final Config config = ConfigFactory.load();
    class ConfigurationMembersInjector<T> implements MembersInjector<T> {
      private final Field field;
      ConfigurationMembersInjector(Field field) {
        this.field = field;
        field.setAccessible(true);
      }
      @Override public void injectMembers(T t) {
        try {
          String key = field.getAnnotation(Configuration.class).value();
          field.set(t, config.getXxxx()); // what to write?
        } catch (IllegalAccessException e) {
          throw new RuntimeException(e);
        }
      }
    }
    class ConfigurationTypeListener implements TypeListener {
      @Override public <T> void hear(TypeLiteral<T> typeLiteral, TypeEncounter<T> typeEncounter) {
        for (Field field : typeLiteral.getRawType().getDeclaredFields()) {
          if (field.isAnnotationPresent(Configuration.class)) {
            typeEncounter.register(new ConfigurationMembersInjector<T>(field));
          }
        }
      }
    }
    bindListener(Matchers.any(), new ConfigurationTypeListener());
  }
}

问题

如何自动将配置项转换为特定但未知的类型?有没有办法说“我希望将此项目转换为这种类型”?另外,有没有办法“注册”自定义转换器?

否则,我是否必须编写自己的转换机制?

4

2 回答 2

1

您尝试做的另一种替代方法是使用Classpath 扫描程序来扫描您的自定义注释(我假设它是Binding Annotation),然后将您的配置值绑定到那些使用这些注释注释的类型。

这是我在开发库时采用的确切方法:Typesafe Config Guice ,它将来自Typesafe Config文件的配置值绑定到带注释的参数和字段。

于 2015-06-22T21:57:41.130 回答
1

自 1.3.0 版(2015 年 4 月 16 日发布)以来,存在一个ConfigBeanFactory,这是最接近我要求的内容。我的项目有点晚了,但碰巧成功了。

于 2015-06-24T16:45:13.273 回答