Spring的AOP五大通知註解
阿新 • • 發佈:2018-12-09
通知註解 :
宣告方法,在方法前加入通知註解,指定要攔截的物件資訊
注意:
* 代表任意修飾符號 任意值
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);
}