统一处理ThreadLocal
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
注解
import java.lang.annotation.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TenantAnnotation {
}
处理
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class TenantAspect {
// @Pointcut填写注解的全路径
@Pointcut("@annotation(cn.wuxian.conf.TenantAnnotation)")
public void tenantAnnotation(){}
@Before("tenantAnnotation()")
public void doBeforeAdvice(JoinPoint joinPoint){
TenantContext.addAttachment("shopId", "liubishop");
TenantContext.addAttachment("storeId","Liubistore");
}
@After("tenantAnnotation()")
public void doAfterAdvice(JoinPoint joinPoint){
TenantContext.clear();
}
}
ThreadLocal
public class TenantContext {
static ThreadLocal<Map<String,Object>> threadLocal = new ThreadLocal<Map<String, Object>>(){
@Override
protected Map<String, Object> initialValue() {
return new LinkedHashMap<String, Object>();
}
};
public static void addAttachment(String key, Object value){
threadLocal.get().put(key,value);
}
public static void addAttachments(Map<String, Object> map){
threadLocal.get().putAll(map);
}
public static String getShopId(){
return String.valueOf(threadLocal.get().get("shopId"));
}
public static Map<String, Object> getAttachments(){
return threadLocal.get();
}
public static String getStoreId(){
return String.valueOf(threadLocal.get().get("storeId"));
}
public static void clear(){
threadLocal.remove();
}
}
使用
放在controller处理即可