上下文
我想使用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());
}
}
問題
如何自動的配置項轉換爲特定的未知類型?有沒有辦法說「我想這個項目轉換爲這種類型」?另外,有沒有辦法「註冊」自定義轉換器?
否則,我必須編寫自己的轉換機制嗎?
它支持將嵌套配置綁定到嵌套的java對象嗎? – user1870400
@ user1870400是的,如果這些對象遵循一些簡化的JavaBeans約定:no-arg構造函數;公共setter和getter爲每個屬性,或者屬性是'Config.getXXX()'方法支持的類型。這意味着屬性的聲明類型必須是要實例化的具體類型。 – erickson