先建立乙個自定義註解
@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...