2014-03-28 83 views
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()); 
    } 
} 

問題

如何自動的配置項轉換爲特定的未知類型?有沒有辦法說「我想這個項目轉換爲這種類型」?另外,有沒有辦法「註冊」自定義轉換器?

否則,我必須編寫自己的轉換機制嗎?

回答

1

從版本1.3.0(2015年4月16日發佈)開始,存在一個ConfigBeanFactory,這與我所問的最接近。我的項目有點晚了,但碰巧做到了。

+0

它支持將嵌套配置綁定到嵌套的java對象嗎? – user1870400

+0

@ user1870400是的,如果這些對象遵循一些簡化的JavaBeans約定:no-arg構造函數;公共setter和getter爲每個屬性,或者屬性是'Config.getXXX()'方法支持的類型。這意味着屬性的聲明類型必須是要實例化的具體類型。 – erickson

0

另一種替代方法是使用Classpath scanner掃描您的自定義註釋(我假設它是Binding Annotation),然後將您的配置值綁定到使用這些註釋進行註釋的那些類型。

這是我在開發我的庫時的確切方法:Typesafe Config Guice,它將Typesafe Config文件中的配置值綁定到註釋的參數和字段。

+1

這並不回答基本問題:「類型安全的配置是否支持自定義轉換器?」 –