上下文
我想使用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