1. 问题引出
如上图,之前的逻辑是项目只有一个mongodb,应用通过mongodbTemplate对mongodb进行操作。
但是,后来业务发生了变化,需要按照租户(tenant)分成两组(group1,group2),将两组不同租户的相关数据存入到两个不同的mongodb中,如下图所示。
2. 解决方案
2.1 分发器模式
弄一个mongodb操作的分发器,根据tenant和dispatcherSelector选择不同的mongoTemplate对mongodb进行操作。但是现状是现有的项目中mongodbTemplate分散在各业务层,改动大。
放弃!!!
2.2 postprocessor动态代理
2.2.1 注入bean
/**
* 使用时,注入这个bean,它将会被代理,根据请求的不同选择daoTemplate01或daoTemplate02
**/
@Bean
@Primary
public DaoTemplate daoTemplate() {
//可以随意写一个,防止注入失败,最后该bean会被动态代理
return new DaoTemplate01();
}
@Bean
public DaoTemplate daoTemplate01() {
return new DaoTemplate01();
}
@Bean
public DaoTemplate daoTemplate02() {
return new DaoTemplate02();
}
2.2.2 动态代理
@Slf4j
@Component
public class DaoTemplateProxy implements BeanPostProcessor {
@Autowired
@Qualifier("daoTemplate01")
private DaoTemplate daoTemplate01;
@Autowired
@Qualifier("daoTemplate02")
private DaoTemplate daoTemplate02;
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
//只代理daoTemplate
if (bean instanceof DaoTemplate && "daoTemplate".equals(beanName)) {
bean = getProxyBean(bean);
}
return bean;
}
private Object getProxyBean(Object bean) {