package com.caiwufei.common.db;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
import com.caiwufei.common.db.mongo.MongoDynamicTemplateSource;
@Component
public class DBContextHolder{
@Autowired
private MongoDynamicTemplateSource dynamicTemplateSource;
private static DBContextHolder dbContextHolder;
private static final ThreadLocal<String> dbName = new ThreadLocal<String>();
private static final ThreadLocal<String> mongoTemplate = new ThreadLocal<String>();
@PostConstruct
public void init() {
dbContextHolder = this;
dbContextHolder.dynamicTemplateSource = this.dynamicTemplateSource;
}
public void setMongoTemplateSource(MongoDynamicTemplateSource mongoTemplateSource) {
this.dynamicTemplateSource = mongoTemplateSource;
}
public static class DB {
public static void changeTargetDataSource(String dataKey){
dbName.set(dataKey);
}
public static String getTargetDataSource(){
return dbName.get();
}
}
public static class Mongo {
public static void changeTargetMongoTemplate(String mongoTemplateKey){
mongoTemplate.set(mongoTemplateKey);
}
public static String getTargetMongoTemplate(){
return mongoTemplate.get();
}
}
public static MongoTemplate mongoTemplate() {
return dbContextHolder.dynamicTemplateSource.getMongoTemplate();
}
}
看上面的代码,工具类DBContextHolder中注入了private MongoDynamicTemplateSource dynamicTemplateSource动态的mongodb模板。
通过设计这个工具类,既是spring中的一个bean,又是一个工具类,静态方法可以直接DBContextHolder.Mongo.getTargetMongoTemplate();这样使用。
模板大致如下:
class O{
@Autowired
private D d;
private static O o;
@PostConstruct
public void init() {
o = this;
o.d = this.d;
}
public void setD(D dd) {
this.d = dd;
}
}