AspectJ + 自定义注解 完成动态代理

面向切面编程,实现方式有三种,最常用的是

1、实现InvocationHandler接口

这样需要根据代理的类,对代码结构有小小的破坏,对外直接是代理类来调用。

2、基于Spring 的AOP方式

这种和实现接口一样,也需要有个新的类来代理,对外直接是代理类来调用。

3、基于Aspectj + 自定义注解来实现,这个很完美,对外调用不需要重写类,直接在方法上加上自定义的注解就行

@Autowired
RedisLockUtil redisLockUtil;

@Pointcut("execution(* *(..)) && @annotation(com.pa.market.common.redis.RedisLock)")
private void lockPoint() {
}

@Around("lockPoint()")
public Object around(ProceedingJoinPoint pjp) throws Throwable{
    RedisLock redisLock = null;
    MethodSignature methodSignature = (MethodSignature)pjp.getSignature();
    Method method = methodSignature.getMethod();
    redisLock = method.getAnnotation(RedisLock.class);
    if (redisLock == null) {
        Method targetMethod = pjp.getTarget().getClass().getDeclaredMethod(methodSignature.getName(), methodSignature.getMethod().getParameterTypes());
        redisLock = targetMethod.getAnnotation(RedisLock.class);
    }
    String timeStamp = String.valueOf(redisLock.keepLockTime() + System.currentTimeMillis());
    redisLockUtil.lock(redisLock.value(), timeStamp);
    Object object = pjp.proceed();
    redisLockUtil.unlock(redisLock.value(),timeStamp);
    return object;
}


 @RedisLock(value = "querylistLock", keepLockTime = 2000)
public void queryList(){
    System.out.println("start");
}

@RedisLock(value = “querylistLock”, keepLockTime = 2000) 这个自定义的注解,直接在需要代理的方法上加上这个注解
很方便。

// 疑问点: 这种切面的表达式,会不会影响效率?

@Pointcut(“execution(* *(..)) && @annotation(com.pa.market.common.redis.RedisLock)”)

你可能感兴趣的:(【JAVA语言】)