java - 基于国家/地区的 Spring Boot 依赖注入(inject)

标签 java spring spring-boot dependency-injection

我正在尝试根据哪个国家/地区在运行时调用我的端点来实现依赖项注入(inject),因此我进行了以下设置。

public interface Client {
  void call(Data data);
} 

@Profile({"prod"})
public class ClientA implements Client {
  @Override
  public void call(Data data) {
    // implementations goes here
  }
}

@Profile({"dev"})
public class ClientB implements Client {
  @Override
  public void call(Data data) {
    // implementations goes here
  }
}

但是现在这个设置就足够了,因为这仅取决于应用程序运行的环境。我查看了 springs @Condition 注释,但它似乎还不够。我想要实现的目标是能够在我的属性文件中定义一个属性,该属性定义了给定的 impl 应在运行时初始化的国家/地区。所以类似:

@Profile("${client.a.countries}")
public class ClientA implements Client {
  @Override
  public void call(Data data) {
    // implementations goes here
  }
}

然后在我的 application.propeties 文件中我只定义 client.a.countries=DE,GB,ES。有什么方法可以实现这一点吗?因此,当前端调用我的端点时,我知道它是从哪个国家/地区调用的,因此应该知道要使用哪个实现。我是否错误地追求了这一点,我应该考虑进行某种工厂模式实现来实现我的目标,还是可以使用 Spring 实现?

最佳答案

我通过创建一个 ClientRegistry 解决了这个问题,其中所有客户端都在其目标国家/地区( map 等)进行注册

public class ClientRegistry {
    private Map<String,Client> clients ;

    @Autowired
    public ClientRegistry(List<Client> clients) {

        this.clients = clients.stream().collect(Collectors.toMap(Client::getCountry, Function.identity() )) ;
    }

    public Client getClient(String country) {
        return clients.get(country);
    }
}

在客户端界面中,您必须添加getCountry

public interface Client
{
    void call(Data data);

    String getCountry();
}

现在您可以选择让 ClientRegistry 实现客户端功能并将调用委托(delegate)给适当的客户端,或者在 Cotroller 中您始终调用客户端,如 clientRegistry.getClient(country).call(data)

关于java - 基于国家/地区的 Spring Boot 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60954196/

相关文章:

java - 通过将数组中的值与现有键相加来构造 HashMap,而不覆盖键

spring - 了解Spring Cloud Eureka Server self 保存和续订阈值

java - 无法将 mssql 时间戳列映射到 hibernate

java - org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean

java - Android 4.4 KitKat 无法快速关闭 ChunkedInputStream

java - 只有当前 Activity 类,应该得到监听器的回调,而不是所有类,java

java - Spring webServiceTemplate 连接超时属性

java - TomEE war 部署失败

java - 为什么不显示此 Swing 选项卡式 Pane ?

java - 注解类型可以定义静态方法吗?