创建一个对象,用List还是map都可以,
把这个实体作为Bean,交给spring管理,可以保证全局唯一。
仔细观察可以发现,这个里servers成员变量是final,这里就要细说一下了,把实体作为bean注入的话,spring会根据你已有的构造参数来初始化变量。没有则是无参构造。如果是final修饰的话,我们无法调用set方法,只能在构造参数中注入。
那么怎么注入呢??
用其他的bean注入(spring中有的bean),提供一个方法,如图shopConfig对象,这个接口可以把数据写死,写死的话直接在实体构造方法写死就可以了(注入其他bean没有意义),也可以连接数据库查询数据
@Component
public class PollingRule {
private final List<String> servers;
private int currentIndex;
public PollingRule(ShopConfig shopConfig) {
this.servers = shopConfig.getServiceList();
this.currentIndex = 0;
}
public synchronized String getNextServer() {
String server = servers.get(currentIndex);
currentIndex = (currentIndex + 1) % servers.size();
return server;
}
}
使用的话就非常简单了
@Resource
private PollingRule pollingRule;
直接注入就可以了,在具体业务中调用轮询规则getNextServer()
String nextServer = pollingRule.getNextServer();
log.info("userId,{},{}", userId, nextServer);