java - 根据配置文件中的值注入(inject)依赖项

标签 java spring jakarta-ee dependency-injection cdi

我有一个类,它通过 DI 获取配置接口(interface)实现。

@Inject
private PRCConfiguration prcConfig;

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

我相信我们可以通过限定符注释不同的实现,然后注入(inject),比如

@Inject @NewImplementation 
private PRCConfiguration prcConfig;

但我再次通过硬编码在编译时注入(inject)。

我的配置文件类似于

"injectconfig":"NewImplementation"

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

"injectconfig":"DifferentImplementation"

并且将注入(inject)不同的实现。

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

最佳答案

您可以使用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 实例的唯一方法。

关于java - 根据配置文件中的值注入(inject)依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39433696/

相关文章:

java - 从一个函数返回 2 个计数值

java - Spring @Value 注解中可以指定多个属性名称吗?

jakarta-ee - CDI事务管理: How does @Transactional work?

java - 如何预先加载实体列表?

java - 将 JasperReports 与 Spring 集成

JSF 2.0 : Validate equality of 2 InputSecret Fields (confirm password) without writing Code?

java - 使用参数化类型实现 guice Provider

java - RecyclerView.OnScrollListener 的问题

java - FileInputStream 在另一个类中?

java - JPA + Hibernate + CrudRepository 刷新?