- 本文基礎WEB環境使用SpringBoot及Spring-Data-Jpa構建
-
關於SpringBoot及JPA用法本文不再過多討論,下面是引入的jar:
起步依賴
web及aop依賴
jpa依賴
mysql驅動 - 本文着重AOP的使用,你也可以使用自己構建的環境
- 由於本文中使用的JPA,因此首先創建保存日志及保存異常的實體類,如果你使用的是Mybatis,則需要首先創建表然后根據表來逆向生成實體類
-
保存日志的實體類:
日志實體 -
保存異常的實體類:
異常實體
-
接下來我們定義一個Operation注解,用於聲明在方法上描述此方法執行了什么操作:
操作注解
- @Target 聲明這是一個自定義注解類,ElementType.METHOD 表明此注解可聲明在方法上
- @Retention 聲明注解保留期限,RetentionPolicy.RUNTIME 表明此注解可保留至運行時,可以通過反射獲取注解信息
-
然后編寫一個AOP切面類,由於使用的SpringBoot只要保證在Application子目錄之下就被會自動掃描,所以只需要注解聲明即可,並不需要額外配置
請求切面
- @Aspect 聲明這是一個切面類
- @Compoent 此類交由Spring容器管理
-
定義請求日志切入點:
切入點
- @PointCut 定義請求日志切入點,其切入點表達式有多種匹配方式,詳細請自行參閱資料,此處切入點為所有聲明@Operation注解的方法
-
編寫方法的前置通知:
前置通知
- 前置通知在執行目標方法之前執行
- 在前置通知中設置請求日志信息,如開始時間,請求參數,注解內容等
-
編寫方法的返回通知:
返回通知
- 返回通知,在目標方法正常結束之后執行
- 在返回通知中補充請求日志信息,如返回時間,方法耗時,返回值,並且保存日志信息
-
編寫方法的異常通知:
異常通知
- 異常通知,在目標方法非正常結束,發生異常或者拋出異常時執行
- 在異常通知中設置異常信息,並將其保存
- Spring AOP 共計五種通知,由於本文中只需要三種,其它兩種只做簡單介紹,如有興趣請自行查閱資料
- 后置通知:在目標方法執行之后執行,與返回通知不同的是此通知無法拿到返回值,並且不管是否發生異常都會執行
- 環繞通知:圍繞動態代理的全過程,需要攜帶ProceedingJoinPoint參數,並且必須有返回值,且ProceedingJoinPoint類型的參數可以決定是否執行目標方法
- 在前置通知中設置請求日志信息的工具類:
-
獲取請求IP
獲取請求IP -
獲取請求方式
獲取請求方式 -
獲取切入點的參數信息
獲取切入點的參數信息
獲取切入點的參數信息
-
編寫一個簡易Controoler,用於測試請求日志記錄:
測試請求日志
-
啟動SpringBoot之后,訪問測試請求日志的URL,查看請求日志表記錄,可以看到日志已成功記錄:
請求成功
請求日志表記錄 -
接下來把測試請求日志的Controoler修改為拋出一個異常,測試異常記錄:

測試異常日志
-
然后重新啟動SpringBoot,再次訪問剛才的URL,可以看到產生了異常:
請求異常 -
再次查看請求日志表,發現還是一條記錄,說明異常通知執行后並不會執行返回通知,這正是我們期望的結果:
請求日志記錄 -
然后我們再查看異常記錄表,發現已經將異常記錄:
異常日志
至此,SpringBoot AOP記錄請求日志和異常日志完成
作者:陪你一起debug
鏈接:https://www.jianshu.com/p/d8a654993719
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。