0%

java AOP切面处理

在返回给客户端前,通过 AOP 给返回的类做处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Aspect
@Component
public class ResponseAspect {

// 定义切点
@Pointcut("execution(public * gy.finolo..*.*(..))")
public void afterResponse() {
}

@AfterReturning(returning = "object", pointcut = "afterResponse()")
public void doAfterReturning(Object object) {
if (object instanceof Response) {
// logic
}
}
}

AOP 有如下5种通知类型,@Around, @Before, @After, @AfterReturning 和 @AfterThrowing。

  • 如果在通知内都未调用 proceedingJoinPoint.proceed(),那执行顺序为如下:

Around -> After -> AfterReturning (正常返回) | AfterThrowing (异常返回)

  • 如果在通知内部调用了 proceedingJoinPoint.proceed(),此句代码相当于是执行 Before(如果有的话) 和 目标对象的方法 逻辑。

Pointcut注解

Pointcut 表达式除了使用 execution 以外,还可以使用 annotation,比如:

定义切点

@Pointcut("@annotation(gy.finolo.anno.AopAnnotation)")

我们再创建一个注解

1
2
3
4
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AopAnnotation {
}

在方法上面只要是被 @AopAnnotation 注解了,那逻辑都会被切入。