使用AOP統一處理日誌

2021-09-13 09:01:47 字數 3332 閱讀 5384

aop我想大家都很清楚,有時候我們需要處理一些請求日誌,或者對某些方法進行一些監控,如果出現例外情況應該進行怎麼樣的處理,現在,我們從spring-boot中引入aop.

[開發環境:jdk版本號為1.8,spring

boot的版本號為1.4.1]

首先,我們先引入jar包,

pom檔案新增如下內容:

org.springframework.boot

spring-boot-starter-aop

com.google.code.gson

gson

2.7

引入jar包後,我們在boot的啟動方法,增加兩個簡單的請求處理方法:

@restcontroller

public static void main(string args)

//測試無參的get請求

public uservo test()

//測試有參的get請求,讓aop列印引數內容

public uservo test(string name,string age,string ***)

增加了兩個簡單的處理請求方法後,我們來增加我們的aop

//申明是個切面

@aspect

//申明是個spring管理的bean

@component

@order(1)

public class aspectdemo

//請求method前列印內容

@before(value = "controlleraspect()")

public void methodbefore(joinpoint joinpoint)

//在方法執行完結後列印返回內容

@afterreturning(returning = "o",pointcut = "controlleraspect()")

public void methodafterreturing(object o )

兩者配置好之後,接下來,我們請求,然後檢視列印日誌,首先,啟動我們的容器,然後我們先請求有參的處理請求方法的,列印日誌如下:

可以發現,請求的url,method,以及args引數的值,還有型別,以及返回的內容都列印出來了,說明,這是aop攔截成功了.

接下來,我們測試下請求無參的處理請求方法,列印日誌如下:

我們可以發現,這個方法,列印的方法引數是個空陣列,是因為方法不需要引數傳遞.

以上就是springboot引用aop進行處理web的日誌處理,下面將新增aop切面的主要幾個註解,下面只是對註解的描述跟使用,具體測試,作者就不進行測試了,各位看官有興趣的話,可以自己測試一下:

類註解:

@aspect將乙個類定義為乙個切面類

@order(i)標記切面類的處理優先順序,i值越小,優先級別越高.ps:可以註解類,也能註解到方法上

方法註解:

@pointcut定義乙個方法為切點裡面的內容為乙個表示式,下面詳細介紹

@before 在切點前執行方法,內容為指定的切點

@after 在切點後,return前執行,

@afterreturning在切入點,return後執行,如果想對某些方法的返回引數進行處理,可以在這操作

@around 環繞切點,在進入切點前,跟切點後執行

@afterthrowing 在切點後丟擲異常進行處理

@order(i) 標記切點的優先順序,i越小,優先順序越高

@pointcut註解組合使用:

上面**中,我們定義了乙個切點,該切點只進行處理指定路徑的:

private void controlleraspect(){}

現在,我們在定義乙個處理其他路徑下的切點:

@pointcut("execution(public * com.demo.*.*(..))")

private void controllerdemo(){}

以上切點,都是分別處理不同的內容,如果我們需要乙個切點來處理他們兩者,我們可以這麼配置:

@pointcut(value = "controlleraspect()||controllerdemo()")

private void all(){}

在@pointcut註解內,直接引用其它被@pointcut註解過的方法名稱,這樣,該切點就可以處理兩個路徑下的方法

@pointcut註解中的execution表示式: public * com.demo..(…)

第乙個 public 表示方法的修飾符,可以用*代替

第乙個 * 表示 返回值,代表所有

com.demo. 包路徑,.表示路徑下的所有包

第三個. 表示路徑下,所有包下的所有類的方法

(…) 表示不限方法引數

關於@order(i)註解的一些注意事項:

註解類,i值是,值越小,優先順序越高

註解方法,分兩種情況

註解的是 @before 是i值越小,優先順序越高

註解的是 @after或者@afterreturning 中,i值越大,優先順序越高

總結兩者的概括就是:

在切入點前的操作,按order的值由小到大執行

在切入點後的操作,按order的值由大到小執行

延伸:有看官可能會問,如果我要列印請求從進來,到結束,所需要的時間,定義乙個成員變數,用來統計時間,同時給@before跟@afterreturning訪問,可能會有同步的問題,所以我們引用乙個threadlocal指定泛型的物件,在@before記錄請求的時間,在@afterreturning扣除記錄的時間,就是消耗的時間,**如下:

//申明是個切面

@aspect

//申明是個spring管理的bean

@component

@order(1)

public class aspectdemo

//請求method前列印內容

@before(value = "controlleraspect()")

public void methodbefore(joinpoint joinpoint)

//在方法執行完結後列印返回內容

@afterreturning(returning = "o", pointcut = "controlleraspect()")

public void methodafterreturing(object o)

}

Spring MVC 統一處理異常值AOP

思想 下班後,站在熙熙攘攘的地鐵上,看到乙個帖子,技術和思想的重要性。一位樓主的話讓我感受很深刻 論技術和思想的重要性,他說到他的開發水平不是很高,但是他認為他所具有的思想是很不錯的,他談到對自己手下的員工的高要求,讓他們在寫出來的 不至於那樣的笨重,他說他很嚴格,但是還是有人願意跟著他,為什麼呢?...

統一處理異常

1.controlleradvice 註解定義全域性異常處理類 controlleradvice public class globalexceptionhandler 2.exceptionhandler 註解宣告異常處理方法,註解的方法的引數列表裡,還可以宣告很多種型別的引數 controlle...

Web應用架構 錯誤統一處理, 和事務統一處理

因為前期,重點放在業務分析上,這兩塊一直認真思考過,覺得很簡單.一開始只是找了乙個nhibernate的示例,就決定把session的open和close和事務 transaction 的commit,放在httpmodule中處理.算是session per request的模式.之後,繼續加入錯...