基于国家/地区的春季启动依赖项注入



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

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解决了这个问题,在这个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实现客户端功能,并删除对相应客户端的调用,或者在Cotroller中,您总是像clientRegistry.getClient(country).call(data)一样调用客户端

最新更新