【发布时间】: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