【问题标题】:Spring boot dependency inject based on country基于国家/地区的 Spring Boot 依赖注入
【发布时间】:2020-03-31 15:26:49
【问题描述】:

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

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 可能?

【问题讨论】:

  • “我也应该能够知道要使用哪个实现”是什么意思。 ?你怎么知道的?
  • @pvpkiran 我已经编辑了公式,希望现在更容易理解,抱歉我的英语不好。
  • 你的英语是 gud enuf。我明白你说的。但我问的是您将如何根据国家/地区选择实施?需要映射吗?您可以根据@Profile 或@Condition 或其他东西初始化应该激活的实现类,但最后你需要一个映射对吗?
  • “当前端呼叫我的端点时,我知道它从哪个国家/地区呼叫” 是因为前端在每个请求上都发送一个国家/地区代码吗? --- "我只是定义client.a.countries=DE,GB,ES" 如果您有更多国家/地区的实现,为什么不初始化所有这些?我的意思是,如果您有FR 的实现,为什么不初始化法语,这样法语客户端也可以使用端点?除非每个国家/地区的初始化速度极慢,或者每个国家/地区占用大量内存,否则没有理由限制服务器/后端上的国家/地区。

标签: java spring spring-boot dependency-injection


【解决方案1】:

我曾经通过创建一个 ClientRegistry 解决了这个问题,所有客户都在其中注册到他们打算去的国家/地区(地图左右)

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 实现 Client 功能并将调用委托给适当的 Client 或在 Cotroller 中调用 Client 总是像 clientRegistry.getClient(country).call(data)

【讨论】:

  • 谢谢,我会尽快看看,目前正在研究其他内容,如果我成功了,我会告诉你的!
  • 终于有时间看看它,它似乎工作我将添加一个编辑来展示我是如何做到的,但和你说的差不多,谢谢@Turo
猜你喜欢
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
相关资源
最近更新 更多