java 拦截器中使用反射

package com.awj.mall.restfulapi.common.aop;


import com.awj.mall.restfulapi.common.annotation.DLock;
import com.awj.mall.restfulapi.common.annotation.RLockKey;
import com.awj.mall.restfulapi.common.aop.bean.LockKey;
import com.awj.mall.restfulapi.common.aop.bean.RLockBeanDefinition;
import com.awj.mall.restfulapi.modular.base.result.JsonResult;
import com.awj.mall.restfulapi.modular.base.result.ResultCode;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

@Aspect
@Component
public class RLockAop {

    private static Logger logger = LoggerFactory.getLogger(RLockAop.class);


    private static Map<String, RLockBeanDefinition> rLockKeysCacheMap = new ConcurrentHashMap<String, RLockBeanDefinition>();

    @Autowired
    private RedissonClient redissonClient;

    @Around("execution(* com.awj.mall..*(..))&& @annotation(com.awj.mall.restfulapi.common.annotation.DLock)")
    public Object lock(ProceedingJoinPoint point) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) point.getSignature();
        Method method = methodSignature.getMethod();
        String name = getDefinitionName(method);
        RLockBeanDefinition rLockBeanDefinition = getBeanDefinition(name);
        List<LockKey> lockKeys = null;
        DLock dLock = null;
        if (rLockBeanDefinition == null) {
            rLockBeanDefinition = new RLockBeanDefinition();
            dLock = method.getAnnotation(DLock.class);
            rLockBeanDefinition.setdLock(dLock);
            rLockBeanDefinition.setMethodName(name);
            Parameter[] parameters = method.getParameters();
            lockKeys = new LinkedList<LockKey>();
            for (int i = 0; i < parameters.length; i++) {
                LockKey lockKey = new LockKey();
                Parameter parameter = parameters[i];
                RLockKey rLockKey = parameter.getAnnotation(RLockKey.class);
                if (rLockKey != null) {
                    lockKey.setKey(rLockKey.key());
                    lockKey.setPosition(i);
                    lockKeys.add(lockKey);
                }
            }
            if (lockKeys.size() > 0) {
                rLockBeanDefinition.setLockKeys(lockKeys);
            }
            addBeanDefinition(rLockBeanDefinition);
        } else {
            dLock = rLockBeanDefinition.getdLock();
            lockKeys = rLockBeanDefinition.getLockKeys();
        }

        Object[] args = point.getArgs();
        String key = dLock.key();
        if (lockKeys != null && lockKeys.size() > 0) {
            for (LockKey each : lockKeys) {
                key = key.replaceAll("#" + each.getKey(), convertToStr(args[each.getPosition()]));
            }
        }
        Long waitTime = dLock.waitTime();
        TimeUnit timeUnit = dLock.timeUnit();
        System.out.println("lock --> key:"+key);
//        logger.info("lock --> key:"+key);
        RLock rLock = redissonClient.getLock(key);
        try {
            if (rLock.tryLock(waitTime, timeUnit)) {
                return point.proceed();
            }
        } catch (Exception e) {
            logger.error(e.getMessage());
        } finally {
            rLock.unlock();
        }
        return JsonResult.error(ResultCode.SYS_BUSY);
    }


    /**
     * @param obj
     * @return
     */
    public String convertToStr(Object obj) {
        if (obj == null) {
            return "";
        }
//        Assert.notNull(obj,"lockKey is null");
        return obj.toString();
    }


    public String getDefinitionName(Method method) {
        Class clazz = method.getDeclaringClass();
        return clazz.getName() + ":" + method.getName() + "()";
    }





    public void addBeanDefinition(RLockBeanDefinition rLockBeanDefinition ){
        rLockKeysCacheMap.put(rLockBeanDefinition.getMethodName(),rLockBeanDefinition);
    }


    public RLockBeanDefinition getBeanDefinition(String method){
       return rLockKeysCacheMap.get(method);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值