当前位置: 首页 > 知识库问答 >
问题:

根据Quarkus中的应用程序属性注入不同的实现

蔡弘扬
2023-03-14

我有一个存储库接口,它有两个实现。一个从本地存储的CSV文件读取数据,另一个从亚马逊迪纳摩数据库读取数据。我希望能够根据应用程序属性或自定义构建配置文件在我使用的实现之间切换。我通常会在运行时使用工厂来检索正确的类,但是如果可能的话,我希望通过注入来实现这一点。

我在使用Spring boot时发现了一个类似的问题,但在运行时找不到在Quarkus Spring choose bean实现中适用的等效问题

我还尝试实现了一个类似于文档中的配置类,但同样没有太多运气。https://quarkus.io/guides/cdi-reference#default_beans

我觉得我错过了一些明显的东西,所以任何指点都会非常感激。

以下是我的课程的一个简单示例

@ApplicationScoped
public class ExampleService {

    @Inject
    ExampleRepository repository;

    public List<Data> retrieveData() {
        return repository.retrieveData();
    }
}
public interface ExampleRepository {
    List<Data> retrieveData();
}
@ApplicationScoped
public class DynamoRepository implements ExampleRepository {

    @Override
    public List<Data> retrieveData() {
        //Get Data from DynamoDb
    }
}
@ApplicationScoped
public class CsvRepository implements ExampleRepository {
    @Inject
    CsvBeanHandler csvBeanHandler;
    @Inject
    LocalFileReader fileReader;

    @Override
    public List<Data> retrieveData() {
        // Get data from CSV
    }
}

我目前的申请表中也有以下内容。yml:

com:
    example:
        application:
            storage-type: 'CSV' # OR AMAZON_DYNAMO_DB

共有1个答案

柯易安
2023-03-14

如果您的请求是在启动时基于配置属性绑定正确的实现,我想您的问题可以通过使用@products注释解决:

public class ExampleRepositoryFactory {
  @Config("storage-type")
  String storageType;

  @Produces
  public ExampleRepository dynamoInstance() {
    return storageType == "CSV" ? new CsvRepository() : new DynamoRepository();
  }
}
 类似资料:
  • 在我们项目的一个公共库中,我需要根据使用它的服务来区分一个接口的两个实现。 我通过构造函数注入来注入这个接口,并且需要找出如何根据我们的application.yml中的属性值来确定使用什么实现。 我查看了@Qualifier注释,但它似乎确实需要xml模式中的一个属性。我们没有这样的东西。 在我们代码的一部分中,我们以这种方式读出KafkaListener的属性 我可以在Spring中使用相同的

  • 问题内容: 我有两个第三方类,它们都采用接口的实现。我需要为每个注入不同的实现。 如果执行,如何实现它,以便它在运行时提供所需的实现?提供者不知道谁在请求注射。 从理论上讲,我可以使用,但不能修改正在注入的代码。我想做类似的事情: 显然,“ for”代码不存在,但是有某种等效的方法吗? 问题答案: 您可以使用专用模块来实现此目的,该模块允许您安装(相互不可访问)冲突的绑定,以用于构造有限的一组非冲

  • 我正在学习Spring boot application,并且有使用xml和java配置的Spring应用程序的经验。 我使用的应用程序具有包含UI、服务和DAO的代码基体系结构。所有这些组件都有单独的上下文文件,即。web-applicationcontext.xml或application-servlet-context.xml、service-context.xml和data-context

  • 我编写了一个ClientHttpRequestInterceptor实现,以自动将一些HttpHeader插入到来自Spring Boot服务的任何传出请求中。 我支持的头之一是指示发送此请求的源应用程序。为此,我将“spring.application.name”应用程序属性注入到私有变量中,并使用该私有变量设置HttpHeader。

  • 我正在开发一个spring boot应用程序。在这个应用程序中,我使用以下代码将application.properties创建为spring bean 是否可以在Application.Properties中不使用Https.port字段来运行场景1?