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的模式.之後,繼續加入錯...