【发布时间】:2015-04-17 10:38:28
【问题描述】:
我想使用 goolge/guice 基于我提供的注释类注入一个值。
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;
}
这是我的注释,它允许配置配置类型,应该用于带注释的字段。
用例:
@AutoConfig()
ConfigLoader<?> defaultConfig;
@AutoConfig(provider = JsonConfigProvider)
ConfigLoader<?> jsonConfig;
我想要两个配置,一个是 default/xml 一个,一个是 json 。它们可能永远不会同时出现在同一个班级中。但我不知道何时使用其中一个。我在一个类中使用了这种方法,因为它们是由一些依赖项/库提供的,这个注解将用于一些(可插入的)子模块。
我的Guice模块
public class MyGuiceModule extends AbstractModule {
@Override
protected void configure() {
bind(new TypeLiteral<ConfigLoader<?>>() {})
.annotatedWith(AutoConfig.class)
.toProvider(autoConfig.provider());
}
}
这是关键部分,我无法想象如何实现它。
所以基本上我只想使用注释中指定的提供程序类。 这里也没有必要使用提供者类。因为 autoConfig.provider().newInstance() 基本上是我所需要的。 (我需要在新实例上使用 setter,但这就是我想在这个地方做的所有事情)
总而言之,我真正想做的就是使用 get(AutoConfig autoConfig) 或在构造函数中推送注释(或其值到提供者)。 目前我只使用构造函数来注入我想在新生成的配置实例上设置的 configFile 值。
【问题讨论】:
-
我想这个问题有解决方案,但我现在手头没有。您可以考虑是否真的需要一个具有两种可能行为的限定符,或者您是否只使用 XmlConfig 和 JSonConfig 注释并显式绑定。
标签: java annotations guice inject