package cn.stylefeng.guns.tenant.aop; import cn.stylefeng.guns.base.auth.context.LoginContextHolder; import cn.stylefeng.guns.base.consts.ConstantsContext; import cn.stylefeng.guns.base.tenant.context.DataBaseNameHolder; import cn.stylefeng.guns.base.tenant.context.TenantCodeHolder; import cn.stylefeng.roses.core.mutidatasource.DataSourceContextHolder; import cn.stylefeng.roses.core.util.ToolUtil; 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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; /** * 租户的多数据源切换的aop * * @author fengshuonan * @date 2017年3月5日 上午10:22:16 */ @Aspect @Component public class TenantSourceExAop implements Ordered { private Logger log = LoggerFactory.getLogger(this.getClass()); /** * 拦截控制器层 */ @Pointcut("execution(* *..controller.*.*(..))") public void cutService() { } @Around("cutService()") public Object around(ProceedingJoinPoint point) throws Throwable { try { //根据系统总开关来进行aop,获取当前用户登录的租户标识 if (ConstantsContext.getTenantOpen()) { if (LoginContextHolder.getContext().hasLogin()) { String dataSourceName = LoginContextHolder.getContext().getUser().getTenantDataSourceName(); if (ToolUtil.isNotEmpty(dataSourceName)) { DataSourceContextHolder.setDataSourceType(dataSourceName); log.debug("多租户AOP--TenantSourceExAop--设置数据源为:" + dataSourceName); } } } return point.proceed(); } finally { log.debug("多租户AOP--TenantSourceExAop--清空数据源信息!"); DataSourceContextHolder.clearDataSourceType(); TenantCodeHolder.remove(); DataBaseNameHolder.remove(); } } /** * aop的顺序要早于多数据源切换的 */ @Override public int getOrder() { return -100; } }