一、概述
接口权限执行:当访问当
dao
层接口时,在接口的方法上放置自定义注解,对接口进行拦截
二、ProceedingJoinPoint
ProceedingJoinPoint
是什么?
可以看出其继承于
JoinPoint
,及其关键方法proceed()
【这个方法的用途:继续下一个建议或目标方法调用(就是用于启动目标方法执行的,不调用该方法的话就走自己的逻辑)】
ProceedingJoinPoint
和JointPoint
的区别:
JointPoint
是aop
的,对象则包含了和切入相关的很多信息。比如切入点的对象,方法,属性等。我们可以通过反射的方式获取这些点的状态和信息,用于追踪tracing和记录logging应用信息。
ProceedingJoinPoint
是aspectj
的,其继承于JointPoint
所以主要作用是多了这个proceed()
方法,这个方法主要针对代理链(可以从下面这个方法执行看),(暴露出proceed()
是为了支撑aop:around
这个切面)aop:around
即环绕通知 =前置+目标方法执行+后置
面试官:什么是AOP?Spring AOP和AspectJ的区别是什么?
方法很清晰的告诉我们这里会代理方法的调用(即我们的目标方法)
想了解代理链可以看看Spring AOP核心源码 JdkDynamicAopProxy
二、实现逻辑
- 拦截实现(注解不写了)
@Slf4j
@Aspect
@Component
public class PermissionAop {
//pointcut 是一种程序结构和规则,它用于选取join point并收集这些point的上下文信息。是这些join point的集合
@Pointcut("@annotation(com.xx.Permission)")
public void dataPermissionAspect() {}
@Around("dataPermissionAspect()")
public Object doAroundPermission(ProceedingJoinPoint pjp) throws Throwable {
//根据业务逻辑判断,怎样直接放通
//怎样就加一些逻辑,再让它进入接口方法
Object[] args = pjp.getArgs();
...//这就跟JoinPoint差不多用法
//反正return pjp.proceed();在每个判断条件都是走的
return pjp.proceed();
}
}
- 拦截
dao
层中自己需要的方法
@Repository
public interface DataMapper {
@Permission
List<Data> selectDataList(Data data);
}
JoinPoint
一般获取
三、最后
就到这里,可以根据自己的权限来判断拦截接口
\(^o^)/~