1. 程式人生 > >Spring的AOP五大通知註解

Spring的AOP五大通知註解

通知註解 :

宣告方法,在方法前加入通知註解,指定要攔截的物件資訊 

注意:

* 代表任意修飾符號 任意值

AOP五大通知註解:

@Before 前置通知,在方法執行之前執行
@After  後置通知,在方法執行之後執行(無論是否發生異常)還不能訪問目標方法執行的結果
@AfterRunning 返回通知,在方法正常結束後 返回結果之後執行 可以訪問方法的返回值
@AfterThrowing 異常通知,在方法丟擲異常之後
@Around 環繞通知,圍繞著方法執行

一張圖看看這些通知對應在動態代理中的位置: 這裡寫圖片描述 來分別測試這五大註解。 配置已經在前一章寫過了,直接拿來用:

修改下add方法:

@Override
    public int add(int a, int b) {
        System.out.println("執行add方法");
        return a+b;
    }

@Before :前置通知,在方法執行之前執行

@Aspect
@Component
public class MyAspect {

    @Before("execution(* calculator.CalculatorImpl.*(..))")
    public void beforeMethod(JoinPoint joinpoint){
        String methodName = joinpoint.getSignature().getName();
        List<Object> list = Arrays.asList(joinpoint.getArgs());
        System.out.println("方法:"
+methodName+" 引數是"+list); } }

輸出:

方法:add 引數是[1, 2]
執行add方法
3

@After 後置通知,在方法執行之後執行(無論是否發生異常)還不能訪問目標方法執行的結果:

@After("execution(* calculator.CalculatorImpl.*(..))")
    public void afterMethod(JoinPoint joinpoint){
        String methodName = joinpoint.getSignature().getName();
        List<Object> list = Arrays.asList
(joinpoint.getArgs()); System.out.println("方法:"+methodName+" 引數是"+list); }

輸出:

執行add方法
方法:add 引數是[1, 2]
3

@AfterRunning 返回通知,在方法正常結束後 返回結果之後執行 可以訪問方法的返回值:

 @AfterReturning(value = "execution(* calculator.CalculatorImpl.*(..))",returning = "result")
    public void afterMethod(JoinPoint joinpoint,Object result){
        String methodName = joinpoint.getSignature().getName();
        System.out.println("方法:"+methodName+" 返回值:"+result);
    }

輸出:

執行add方法
方法:add 返回值:3
3

@AfterThrowing 異常通知,在方法丟擲異常之後執行。 可以訪問到異常物件,而且可以指定在出現特定異常時再通知程式碼。

@AfterThrowing(value = "execution(* calculator.CalculatorImpl.*(..))",throwing = "ex")
    public void afterMethod(JoinPoint joinpoint,Exception ex){
        String methodName = joinpoint.getSignature().getName();
        System.out.println("方法:"+methodName+"異常原因:"+ex);
    }