Guice Inject на основе значения аннотации

Я хотел бы использовать goolge / guice для ввода значения, основанного на классе, который я предоставляю с аннотацией.

Автоконфигурация аннотации

@BindingAnnotation
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.PARAMETER, ElementType.FIELD })
public @interface AutoConfig {
    // default null not possible
    Class<? extends Provider<? extends ConfigLoader<?>>> provider() default XMLAutoConfigProvider.class;
}

Это моя аннотация, которая позволяет настроить тип конфигурации, который должен использоваться для аннотированных полей.

USECASE:

@AutoConfig()
ConfigLoader<?> defaultConfig;

@AutoConfig(provider = JsonConfigProvider)
ConfigLoader<?> jsonConfig;

Я хочу иметь два конфига, один по умолчанию / XML и один JSON. Вероятно, они никогда не появятся в одном классе в одно и то же время. Но я не знаю, когда используется тот или иной. Я использовал подход с классом, потому что он предоставляется некоторыми зависимостями / библиотеками, и эта аннотация будет использоваться для некоторых (подключаемых) подмодулей.

MyGuiceModule

public class MyGuiceModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(new TypeLiteral<ConfigLoader<?>>() {})
            .annotatedWith(AutoConfig.class)
            .toProvider(autoConfig.provider());
    }
}

Это критическая часть, я просто не представляю, как это реализовать.

Поэтому я просто хочу использовать класс провайдера, указанный в аннотации. Здесь также не обязательно использовать класс провайдера. Потому что autoConfig.provider (). NewInstance () - это все, что мне нужно. (Мне нужно использовать сеттер на новом экземпляре, но это все, что я хочу сделать в этом месте)

Подводя итог, все, что я действительно хочу сделать, это отправить аннотацию (или ее значения поставщику) либо с помощью get (AutoConfig autoConfig), либо в конструкторе. В настоящее время я использую конструктор только для ввода значения configFile, которое я хочу установить для вновь созданного экземпляра config.

Ответы на вопрос(1)

Ваш ответ на вопрос