一、概念
JoinPoint 是面向切面编程(AOP)中的一个概念。它表示目标类连接点对象,表示在程序执行过程中,可以插入额外逻辑的特定点。在 AOP 中,JoinPoint 是程序执行过程中的一个特定位置,例如方法调用、方法执行前后、异常抛出等。通过在 JoinPoint 上定义切面(Aspect),可以在程序执行过程中动态地插入切面逻辑,实现横切关注点的模块化和复用。简而言之,JoinPoint 是在 AOP 中表示程序执行过程中的特定位置或事件。
该接口封装了Spring中切面相关信息,一般在切面( @Before、@After、@AfterReturning、@AfterThrowing)方法中需要添加JoinPoint参数,作为形参。
二、JoinPoint
常用方法
接口中所有方法,如下图:
- Object getThis():获取代理对象
- Object getTarget():获取被代理对象
- Object[] getArgs():获取目标方法的参数列表
- Signature getSignature():返回被增强的方法的相关信息(修饰符+包名+类名+方法名)
三、ProceedingJoinPoint
ProceedingJoinPoint是JoinPoint的子接口,该对象只在@Around的切面方法中
常用方法
-
Object proceed() throws Throwable;
执行目标方法 -
Object proceed(Object[] var1) throws Throwable;
传入的新的参数去执行目标方法
四、例子
获取方法上的注解,实现滑动时间窗口算法
@Autowired
private SlideWindowUtils slideWindowUtils;
// 配置切入点
@Pointcut("@annotation(cn.lw.annotation.SlideWindowLimit)")
public void slideWindowLimitPointcut() {
}
@Around("slideWindowLimitPointcut()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 获取注解属性
SlideWindowLimit slideWindowLimit = ((MethodSignature) pjp.getSignature()).getMethod().getAnnotation(SlideWindowLimit.class);
if (slideWindowUtils.slideWindowAlgorithmByLua(request.getRequestURI(), slideWindowLimit.limitCount(), slideWindowLimit.period())) {
return "操作过于频繁,请稍后重试";
}
return pjp.proceed();
}
具体代码可以查看Java自定义注解+AOP实现滑动时间窗口算法