컨텍스트
Guice를 사용하여 구성 항목을 자동으로 주입하고 싶습니다. 내 구성 프레임 워크는 typesafe의 구성입니다.typesafe의 config는 사용자 지정 변환기를 지원합니까?
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 생성자; 각 프로퍼티에 대한 public setter와 getter이거나, 프로퍼티는'Config.getXXX()'메소드에 의해 지원되는 타입이다. 즉, 선언 된 유형의 특성은 인스턴스화 할 구체 유형이어야합니다. – erickson