Guice injetar com base no valor da anotação
Gostaria de usar goolge / guice injetar um valor com base em uma classe que forneço com a anotação.
Anotação AutoConfig
@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;
}
Esta é minha anotação que permite configurar o tipo de configuração, que deve ser usado para os campos anotados.
Caso:
@AutoConfig()
ConfigLoader<?> defaultConfig;
@AutoConfig(provider = JsonConfigProvider)
ConfigLoader<?> jsonConfig;
Eu quero ter duas configurações, uma padrão / xml e uma json. Provavelmente nunca ocorrerão na mesma classe ao mesmo tempo. Mas eu não sei quando um ou outro é usado. Eu usei a abordagem com uma classe porque eles são fornecidos por algumas dependências / libs e essa anotação será usada para alguns submódulos (plugáveis).
MyGuiceModule
public class MyGuiceModule extends AbstractModule {
@Override
protected void configure() {
bind(new TypeLiteral<ConfigLoader<?>>() {})
.annotatedWith(AutoConfig.class)
.toProvider(autoConfig.provider());
}
}
Esta é a parte crítica, eu simplesmente não consigo imaginar como implementá-lo.
Então, basicamente, eu só quero usar a classe de provedor especificada na anotação. Não é necessário usar a classe do provedor aqui também. Porque autoConfig.provider (). NewInstance () é basicamente tudo que eu preciso. (Preciso usar um setter na nova instância, mas é tudo o que quero fazer neste local)
Para resumir, tudo o que realmente quero é enviar a anotação (ou seus valores para o provedor) usando o get (AutoConfig autoConfig) ou no construtor. Atualmente, apenas uso o construtor para injetar o valor configFile que desejo definir na instância de configuração recém-gerada.