天天看点

测试AOP五种切面通知的优先级次序

测试AOP五种切面通知的优先级次序

通知类型

在基于Spring AOP编程的过程中,基于AspectJ框架标准,spring中定义了五种类型的通知,它们分别是:

前置通知 (@Before) 。

返回通知 (@AfterReturning) 。

异常通知 (@AfterThrowing) 。

后置通知 (@After)。

环绕通知 (@Around) :(优先级最高)

通知执行顺序

将上面的所有通知类型写入同一个切面中,它的执行顺序为:

代码展示

package com.cy.pj.common.aspect;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.After;

import org.aspectj.lang.annotation.AfterReturning;

import org.aspectj.lang.annotation.AfterThrowing;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.aspectj.lang.annotation.Pointcut;

import org.springframework.stereotype.Component;

@Aspect

@Component

public class SysTimeAspect {

/**
 * 切入点
 */
@Pointcut("bean(sysMenuServiceImpl)")
public void doTime(){}

@Before("doTime()")
public void doBefore(JoinPoint jp){
    System.out.println("time doBefore()");
}
@After("doTime()")
public void doAfter(){//类似于finally{}代码块
    System.out.println("time doAfter()");
}
/**核心业务正常结束时执行
 * 说明:假如有after,先执行after,再执行returning*/
@AfterReturning("doTime()")
public void doAfterReturning(){
    System.out.println("time doAfterReturning");
}
/**核心业务出现异常时执行
 * 说明:假如有after,先执行after,再执行Throwing*/
@AfterThrowing("doTime()")
public void doAfterThrowing(){
    System.out.println("time doAfterThrowing");
}
@Around("doTime()")
public Object doAround(ProceedingJoinPoint jp)
        throws Throwable{
    System.out.println("doAround.before");
    try {
    Object obj=jp.proceed();
    return obj;
    }catch(Throwable e) {
    System.out.println("doAround.error-->"+e.getMessage());
    throw e;
    }finally {
    System.out.println("doAround.after");
    }
}
           

}

代码正常结束

代码出现异常

原文地址

https://my.oschina.net/u/4115134/blog/3216359