我想使用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());
}
}
如何自动将配置项转换为特定但未知的类型?有没有办法说&#34;我希望这个项目转换为这种类型&#34;?还有,有办法注册&#34;定制转换器?
否则,我是否必须编写自己的转换机制?
答案 0 :(得分:1)
从1.3.0版(2015年4月16日发布)开始,存在ConfigBeanFactory
,这与我的要求最接近。对我的项目来说有点晚了,但碰巧做了这个伎俩。
答案 1 :(得分:0)
您尝试做的另一种替代方法是使用Classpath scanner扫描您的自定义注释(我假设是Binding Annotation),然后将您的配置值绑定到那些用这些注释注释的类型。
这是我开发库时的确切方法:Typesafe Config Guice,它将Typesafe Config文件中的配置值绑定到带注释的参数和字段。