【问题标题】:Injecting dependency based on a value in config file根据配置文件中的值注入依赖项
【发布时间】:2017-01-18 21:50:57
【问题描述】:

我有一个通过 DI 实现配置接口的类。

@Inject
private PRCConfiguration prcConfig;

PRCConfiguration 接口有多种实现方式。目前它正在注入默认实现。我希望在配置文本文件中创建一个值,该值将定义要注入的 PRCCONfiguration 的特定实现。 我希望@Inject 符号能够验证配置文件中的值,并基于该值注入特定的实现。

相信我们可以通过限定符对不同的实现进行注解,然后注入,比如

@Inject @NewImplementation 
private PRCConfiguration prcConfig;

但我再次通过硬编码注入编译时间。

我的配置文件会是这样的

"injectconfig":"NewImplementation"

注入@NewImplementation 实现,随后如果我想注入不同的实现。我可以将配置文件值更改为

"injectconfig":"DifferentImplementation"

不同的实现会被注入。

我的要求可以通过 CDI 实现吗?

【问题讨论】:

    标签: java spring jakarta-ee dependency-injection cdi


    【解决方案1】:

    您可以使用producer methods 来实现类似的效果。

    基本上你只需要创建一个 CDI bean,它的方法返回正确的配置实例并用 @Produces 注释它。

    类似这样的:

    @ApplicationScoped
    public class ConfigurationProducer {
    
        @Produces
        @ApplicationScoped
        public PRCConfiguration getConfig() {
    
            if( someCondition ) {
                return new NewConfigurationImpl();
            }
            else {
                return new OldConfigurationImpl();
            }
    
        }
    
    }
    

    在这种情况下,您应该使用 @Vetoed 注释这两个实现,否则您将得到模棱两可的依赖关系错误。在实现上使用@Vetoed 将告诉CDI,使用生产者是获取PRCConfiguration 实例的唯一方法。

    【讨论】:

    • 非常感谢朋友!
    • 再次为@Vetoed +1,否则会花费数小时调试,但它似乎只在 java ee 7 中可用?
    • Jboss 找不到@Vetoed
    • 在 CDI 1.0 中,您还可以使用不带任何值的 @Typed() 来获得与 @Vetoed 相同的效果。
    猜你喜欢
    • 2022-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多