增强的织入顺序
当一个连接点同时织入多个增强时,就存在顺序调用问题:
1. 增强在同一个切面类中定义:依照增强在切面类中定义的顺序依次织入。
2. 增强位于不同的切面,但果这些切面都实现了org.springframework.core.Ordered
接口,则由接口注解的顺序号决定,顺序号越小,对于不同的增强,织入顺序为:
1. 前置增强->越先织入
2. 后置增强->越后织入
3. 最终增强->越后织入
4. 环绕增强->调用原方法之前的部分先织入,调用原方法之后的部分后织入
我们先来看一个实例:
1.目标对象
package test.aop2;
public class UserController {
public void login(String name){
System.out.println("I'm "+name+" ,I'm logining");
}
}
2. 切面配置
/*-----------------------有序切面类1--------------------------*/
@Aspect
public class Annotation_aspect implements Ordered {
//实现顺序接口
@Pointcut("target(test.aop2.UserController)")
private void pointcut(){}//定义切点
@AfterThrowing("pointcut()")//后置增强
public void AfterThrowing() throws Throwable{
System.out.println("Annotation_aspect 实施AfterThrowing,优先级为" + getOrder());
}
@After("pointcut()")//最终增强
public void after() throws Throwable{
System.out.println("Annotation_aspect 实施after,优先级为" + getOrder());
}
@Before("pointcut()")//前置增强
public void before() throws Throwable{
System.out.println("Annotation_aspect 实施@before,优先级为" + getOrder());
}
@Around("pointcut()")//环绕增强
public void around(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("Annotation_aspect 实施around前,优先级为" + getOrder());
joinPoint.proceed();
System.out.println("Annotation_aspect 实施around后,优先级为" + getOrder());
}
@Override
public int getOrder() {
return 1;
}