前言
承接上一章: Mybatis多租户解决方案; 我们的数据也存在mongodb中, 所以 mongodb也需要一套机制来满足!
设计思路
我们的查询一般都是:mongoTemplate.find(query, LogEntity.class); 其中query是条件, 我们只需在查询前改写 query就行了;所以我们需要监听 mongoTemplate 这个类中的方法, 只要参数中有query 我们就按需要添加租户id;AOP就可以很好的满足这一点
具体实现
话不多说,直接上代码:
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import static org.springframework.data.mongodb.core.query.Criteria.where;
@Aspect
@Component
@Slf4j
public class MongoTemplateAspect {
@Pointcut("within(org.springframework.data.mongodb.core.MongoTemplate)")
public void mongoPointCut() {
}
@Around("mongoPointCut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("========66666666777========");
//获取相关参数
Object[] arguments = joinPoint.getArgs();
for (Object arg : arguments) {
if (arg instanceof Query){
arg = rebuildQuery(arg);
}
break;
}
Object proceed = joinPoint.proceed(arguments);
return proceed;
}
private Object rebuildQuery(Object arg) {
Query query = (Query)arg;
log.info(String.valueOf(query.getQueryObject()));
if(query.getQueryObject().containsKey("uid")){
log.info("666");
}else{
query.addCriteria(where("uid").is(666));
// query.addCriteria(Criteria.where("uid").is("666"));
log.info("7777");
}
log.info(String.valueOf(query.getQueryObject()));
return query;
}
}
实现起来非常简单, 这里我写死了 新增的 query条件:query.addCriteria(where(“uid”).is(666)); 实际上实施中可以增加一个manger 来做管理, 具体可以参考:Mybatis多租户解决方案;
本章只讨论通过aop的基础实现, 实际还可以监听指定方法!