面向切面编程,实现方式有三种,最常用的是
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