自己實現aop切面,發生指定異常重新呼叫當前方法

2021-10-12 12:47:38 字數 3885 閱讀 1896

先建立乙個自定義註解

@target

(elementtype.method)

@retention

(retentionpolicy.runtime)

@documented

public @inte***ce

apiexception

定義異常常量

public

inte***ce

ignoremsg

編寫切面

@aspect

@component

public

class

apiexceptionaspect

/** * 環繞通知

** @param point

* @return

* @throws throwable

*/@around

(value =

"apiexceptionpointcut()"

)public object doaround

(proceedingjoinpoint point)

throws throwable

// 獲取當前的使用者

loginuser loginuser = springutils.

getbean

(tokenservice.

class).

getloginuser

(servletutils.

getrequest()

);// ******===資料庫日誌*****====*//

sysoperlog operlog =

newsysoperlog()

;// 請求的位址

string ip = iputils.

getipaddr

(servletutils.

getrequest()

);operlog.

setoperip

(ip)

; operlog.

setoperurl

(servletutils.

getrequest()

.getrequesturi()

);if(loginuser != null)

// 獲取方法引數

object[

] args = point.

getargs()

;// 返回物件

object result = null;

// 如果異常迴圈請求(這個for迴圈是最關鍵的**)

for(

int i =

0; i < apiexception.

apinumber()

; i++

)catch

(exception e)

}continue;}

operlog.

setstatus

(businessstatus.fail.

ordinal()

);operlog.

seterrormsg

(stringutils.

substring

(e.getmessage()

,0,2000))

;break;}

}// 返回物件

operlog.

setjsonresult

(json.

tojsonstring

(result));

// 獲取全類名名稱

string classname = point.

gettarget()

.getclass()

.getname()

;// 獲取方法名稱

string methodname = point.

getsignature()

.getname()

;// 設定方法名稱

operlog.

setmethod

(classname +

"."+ methodname +

"()");

// 設定請求方式

operlog.

setrequestmethod

(servletutils.

getrequest()

.getmethod()

);// 處理設定註解上的引數

getcontrollermethoddescription

(point, apiexception, operlog)

;// 儲存資料庫

asyncmanager.me(

).execute

(asyncfactory.

recordoper

(operlog));

//返回結果

return result;

}catch

(exception e)

", e.

getmessage()

);e.

printstacktrace()

;}return null;

}/**

* 獲取註解中對方法的描述資訊

** @param apiexception api返回處理

* @param operlog 操作日誌

*/public

void

getcontrollermethoddescription

(joinpoint joinpoint, apiexception apiexception, sysoperlog operlog)

}/**

* 獲取請求的引數,放到log中

** @param operlog 操作日誌

*/private

void

setrequestvalue

(joinpoint joinpoint, sysoperlog operlog)

/** * 是否存在註解,如果存在就獲取

*/private apiexception getapiexceptionhandle

(joinpoint joinpoint)

return null;

}/**

* 引數拼裝

*/private string argsarraytostring

(object[

] paramsarray)}}

return params.

trim()

;}/** * 判斷是否需要過濾的物件。

** @param o 物件資訊。

* @return 如果是需要過濾的物件,則返回true;否則返回false。

*/public

boolean

isfilterobject

(final object o)

}

自定義異常

public

class

customexception

extends

runtimeexception

註解應用

@apiexception

(title =

"重新整理驗證碼"

, apinumber =

2, ignoremsg = ignoremsg.timed_out, businesstype = businesstype.hh)

private

void

refreshcode

(int number)

}

AOP切面的實現

aop的全稱是aspect orient programming,即面向切面程式設計。是對oop object orient programming 的一種補充,戰門用於處理一些具有橫切性質的服務。常常用於日誌輸出 安全控制等。最近遇到增加操作日誌記錄功能問題,網上推薦使用切面技術實現,可以在不修改...

Proxy實現AOP切面程式設計

通過jdk的proxy 實現對業務類做簡單的aop實現 介面 userservice 包含的方法為切入點,會被 攔截 類 userserviceimpl 實現userservice介面 類 userservicefactory 工廠模式生成動態 類 myaspect 切面類,實現對切入點的操作 us...

Spring 通過註解方式實現AOP切面程式設計

spring 切面程式設計的目的是實現 的業務邏輯的解耦。切面程式設計用於諸如日誌記錄,事務處理,等非業務性的邏輯操作。目前spring的aop只能應用於方法層級上,無法在類 成員欄位等層級上操作。以下是srping的aop程式設計分為註解方式和xml配置方式。以下過程詳細說明了通過註解方式實現ao...