Spring入門知識 ———— 實現AOP返回通知、異常通知、環繞通知
阿新 • • 發佈:2018-12-19
一、引言
以你為AOP只有前置通知和後置通知嗎? 那你就錯啦
在AOP中一共有五種方式:
@Befor:前置通知:在方法執行之前執行
@After:後置通知,在方法之後執行
@AfterReturning:返回通知,在方法返回結果之後執行
@AfterThrowing:異常通知:在方法丟擲異常之後
@Around:環繞通知,圍繞著方法執行
先定義一個橫切點:
/** * 定一個Pointcut,此方法沒有返回值和引數 * 該方法就是一個標識,不進行呼叫 * * execution中解釋: * 第一個* :表示任意修飾符的方法 * com.spring.two.UserMangeImpl.* : 具體的類下面全部的方法 * (..):任意引數列表 */ @Pointcut("execution(* com.spring.two.UserMangeImpl.*(..))") public void beforLog(){}
二、返回通知
/**
* 方法正確返回時呼叫
* returning 使用這個屬性,指定接收的返回值
* @param result
*/
@AfterReturning(value = "beforLog()",returning ="result")
public void insertLogAfterReturning(Object result){
System.out.println("InsertLogHeadr.insertLogAfter 返回值-->" + result);
}
三、異常通知
/**
* 方法發生異常之後
* throwing 使用這個屬性,可以指定某一個異常後執行
*/
@AfterThrowing(value = "beforLog()",throwing = "ex")
public void insertLogAfterThorwing(Exception ex){
System.out.println("InsertLogHeadr.insertLogAfterThorwing");
}
四、環繞通知
返回通知,和異常通知就沒有什麼好說的了。 這個環繞通知,那我就還得說說說下。 環繞通知就相當於動態代理的全過程,看過小編之前講動態代理實現的那個章節,可能有點印象。 註釋上也說了,環繞通知需要攜帶一個引數,並且一定要有返回值 。
/**
* 環繞通知需要攜帶ProceedingJoinPoint型別引數
* 環繞通知必須有返回值,返回值即為目標方法的返回值
* @param joinPoint
* @return
*/
@Around("beforLog()")
public Object insertLogAround(ProceedingJoinPoint joinPoint){
Object result = null;
try {
//前置通知
System.out.println("前置通知.......");
//呼叫目標的方法
result = joinPoint.proceed();
//返回通知
System.out.println("返回通知.......");
} catch (Throwable e){
e.printStackTrace();
//異常通知
System.out.println("異常通知.......");
}
//後置通知
System.out.println("後置通知.......");
return result;
}