实现MongoDB多数据源的自动切换
一、实现原理
1、通过参考Spring的AbstractRoutingDataSource抽象类(该类充当了DataSource的路由中介, 能有在运行时, 根据某种key值来动态切换到真正的DataSource上),重新构造一个AbstractMongoDBRoutingMongoTemplate抽象类,实现多mongdbTemplate的自动切换。
AbstractMongoDBRoutingMongoTemplate的源码:
/**
* @title: AbstractMongoDBRoutingMongoTemplate
* @company: 北京云知声信息技术有限公司
* @author: lizehao
* @date: 2016年10月18日
*/
public abstract class AbstractMongoDBRoutingMongoTemplate implements InitializingBean {
private Map<Object, Object> targetMongoTemplates;
private Object defaultTargetMongoTemplate;
private Map<Object, MongoTemplate> resolvedMongoTemplates;
private MongoTemplate resolvedDefaultMongoTemplate;
public void setTargetMongoTemplates(Map<Object, Object> targetMongoTemplates) {
this.targetMongoTemplates = targetMongoTemplates;
}
@Override
public void afterPropertiesSet() {
if (this.targetMongoTemplates == null) {
throw new IllegalArgumentException("Property 'targetMongoTemplates' is required");
}
this.resolvedMongoTemplates = new HashMap<Object, MongoTemplate>(this.targetMongoTemplates.size());
for (Map.Entry<Object, Object> entry : this.targetMongoTemplates.entrySet()) {
Object lookupKey = resolveSpecifiedLookupKey(entry.getKey());
MongoTemplate mongoTemplate = resolveSpecifiedMongoTemplate(entry.getValue());
this.resolvedMongoTemplates.put(lookupKey, mongoTemplate);
}
if (this.defaultTargetMongoTemplate != null) {
this.resolvedDefaultMongoTemplate = resolveSpecifiedMongoTemplate(this.defaultTargetMongoTemplate);
}
}
protected Object<