切面的用法,獲取切點的引數,以及返回值
監聽到了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方法
切點和獲取切點方法處的引數