1. 程式人生 > >切面的用法,獲取切點的引數,以及返回值

切面的用法,獲取切點的引數,以及返回值

監聽到了impl下面的所有的方法

 

 

ps:注意

 

由@Before註解定義的方法會在 execution() 表示式內的方法被呼叫之前執行

由@After註解定義的方法會在 execution()表示式內的方法被呼叫之後執行,無論方法執行成功與否

由@AfterReturning註解定義的方法會在 execution()表示式內的方法被呼叫之後併成功返回結果後執行,若丟擲異常AfterReturning不會執行

由@AfterThrowing註解定義的方法會在 execution()表示式內的方法丟擲異常後執行

由@Around註解定義的方法包裹了被通知的方法,在被通知的方法呼叫之前和呼叫之後執行自定義的行為

execution表示式

如:@AfterReturning("execution(* com.tangcy.npcmeeting.controller.OperateController.save(..))")

* 代表匹配方法的所有修飾符和所有返回值,經測式,方法修飾符若為private則不行,會出錯 500,這裡也可以這樣寫

@AfterReturning("execution(public void com.tangcy.npcmeeting.controller.OperateController.save(..))")

在 * 的位置換成你的方法修飾符跟返回值型別即可

.. 代表匹配方法的所有引數,無論該方法有多少個引數,是什麼型別都匹配,若你的方法行參型別為String 也可以這樣寫

在..的地方換成你的引數型別即可,可寫多個引數型別

@AfterReturning("execution(* com.tangcy.npcmeeting.controller.OperateController.save(String))")

com.tangcy.npcmeeting.controller 為方法的包路徑/名

 

 

ProceedingJoinPoint 只能用於around

 

https://blog.csdn.net/zhou870498/article/details/80071402

可以用切面來監聽捕獲切點的異常,需要joinPoint來獲取到引數和異常資訊

@Around("execution(* com.neusoft.service.impl..*.*(..))")//切點表示式以及通知型別

public Object around(ProceedingJoinPoint joinPoint){//通過joinPoint物件獲取引數以及其他物件資訊

String MethodName = joinPoint.getSignature().getName();

Object result = null;

try {

result = joinPoint.proceed();

} catch (Throwable e) {

if(ResultCode.contains(e.getMessage())){

return ResultUtils.setError(ResultUtils.getResultCodeByName(e.getMessage()));

}

Object[] args = joinPoint.getArgs();

StringBuffer stringBuffer = new StringBuffer();

for (Object ob :args){

stringBuffer.append(ob);

stringBuffer.append(",");

}

logger.error("Method:"+MethodName+",Params:"+stringBuffer.toString()+"error:"+e.getMessage());

return ResultUtils.setError(ResultCode.SYSTEM_ERROR);

}

return result;

}

 

---------------------

 

 

 

注意!!監聽的時候,不要去監聽controller 而是去監聽controller所呼叫的service方法

 

切點和獲取切點方法處的引數