AOP日誌統計實現

AOP日誌統計簡介

日誌統計就是在用戶操作時記錄下用戶的名稱,訪問的哪個控制層,哪個方法,參數是什麼,請求是否成功等等,具體的效果如圖所示

在這裏插入圖片描述
AOP適用於具有橫切邏輯的場合,比如:日誌統計,性能統計,事務管理等等,當然在這裏我們使用AOP進行日誌統計。不用AOP也可以實現,但要在每個需要進行日誌統計的方法里加上,日誌代碼塊,這樣就大大造成了代碼擁擠,增加代碼的重複性,影響開發人員美好的心情。將日誌統計的代碼塊交給AOP進行管理,減輕開發人員的工作量。可以讓開發人員更好的將精力放在業務邏輯上。

AOP日誌流程

1.新建一個普通的java類LogAspact,在裏邊寫一個普通方法around();那麼這麼普通的類怎麼讓他成爲一個具有橫切邏輯的切面類呢?

<!-- 切點 -->
    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

在spring-mvc.xml裏配置上面這行代碼,
<aop:aspectj-autoproxy proxy-target-class=“true”/> 基於類,需要使用cglib庫
<aop:aspectj-autoproxy proxy-target-class=“false”/> 基於接口,需要使用jdk動態代理。
這裏因爲不是接口,只有類,使用通過cglib代理AOP。

在這個類上加上註解@Component @Aspect,標明是具有橫切邏輯的切面類。在around(ProceedingJoinPoint,pjp)方法這個方法上邊加上註解@Around 標明這是一個環繞通知,方法有返回值返回值類型爲Object類型,參數爲:ProceedingJoinPoint,通過pjp.proceed()方法。它代表的是實際要執行的核心業務邏輯,它的返回值就是實際執行方法的返回值,比如productController類中的adaddProduct()方法,返回值就是adaddProduct()方法的返回值,因爲方法返回值類型各不相同,所以用Object接收。
2.需要獲取到session中的用戶信息,所有需要request對象,那麼這裏是通過ThreadLocal+Filter來獲得全局的request對象,具體實現:https://blog.csdn.net/weixin_46763029/article/details/107165061
3.構建對象信息
又通過java的反射機制,
pjp.getTarget().getClass().getName()獲得類名
pjp.getSigNature().getName()獲得方法名
通過request.getParameterMap()獲得參數並將其轉換爲json字符串
在pjp.proceed()方法的try-catch方法中設置狀態,
成功時:info = “調用了”+className+“裏面的”+methodName+“方法”;
失敗時要將異常信息也加到info裏:info = “調用了”+className+“裏面的”+methodName+“方法,失敗原因:”+throwable.getMessage();

在finally的方法裏將log對象信息放入,通過logService.addLog(log);保存到數據庫。
4.後續的完善
在這裏插入圖片描述
雖然後臺開發人員可以看懂,但業務人員看不懂log信息,所以爲了增加用戶體驗度,將用戶的操作加上一個註解,可以直接通過設置註解的value值獲得簡單明瞭的信息。比如addProduct()方法 就可以將註解的value設置成"新增商品",通過action字段展示這個時候就達到簡單易懂的需求了。
具體操作如下:
在這裏插入圖片描述
@Target(ElementType.METHOD) 在方法上使用
@Retention(RetentionPolicy.RUNTIME) 運行時生效
在方法上使用
在這裏插入圖片描述
通過MethodSignature signature = (MethodSignature) pjp.getSignature();
將signature強轉成MethodSignature類型。
通過signature.getMethod()獲得method,這樣就可以通過反射獲得方法是否存在註解,如果存在註解就獲取註解的value值放到action屬性裏
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章