我有一个通过DI实现配置接口的类。
@Inject
private PRCConfiguration prcConfig;
PRCConfiguration接口有各种实现。目前它正在注入默认实现。我希望在配置文本文件中创建一个值,该文件将定义要注入的PRCCOnfiguration的特定实现。 我希望@Inject表示法验证配置文件中的值是什么,并基于注入特定实现。
我相信我们可以通过限定符注释不同的实现,然后注入,例如
@Inject @NewImplementation
private PRCConfiguration prcConfig;
但我再次通过硬编码注入编译时间。
我的配置文件类似于
"injectconfig":"NewImplementation"
注入@NewImplementation实现,随后如果我想要注入不同的实现。我可以将配置文件值更改为
"injectconfig":"DifferentImplementation"
将注入不同的实现。
我需要通过CDI吗?
答案 0 :(得分:2)
您可以使用producer methods来实现这样的目标。
基本上你只需创建一个CDI bean,该方法返回正确的配置实例并用pv3
注释它。
这样的事情:
@Produces
在这种情况下,您应该使用@ApplicationScoped
public class ConfigurationProducer {
@Produces
@ApplicationScoped
public PRCConfiguration getConfig() {
if( someCondition ) {
return new NewConfigurationImpl();
}
else {
return new OldConfigurationImpl();
}
}
}
注释两个实现,否则您将获得不明确的依赖项错误。在实现上使用@Vetoed
将告诉CDI使用生成器是获取@Vetoed
实例的唯一方法。