@Aspect public class Aspect { @Before("execution(* com.test.*.*(..))") public void logBefore(JoinPoint joinPoint) { logEnter..... } @After("execution(* com.test.*.*(..))") public void logAfter(JoinPoint joinPoint) { logExit..... } }
Spring config:
<aop:aspectj-autoproxy/> <bean id="aspect" class="com.test.Aspect"></bean>
# 最近開發了一個項目,由於專案在整個開發過程中處於趕時間狀態(每個專案都差不多如此)所以專案在收尾階段發現缺少記錄系統日誌功能,以前系統都是直接寫在每個模組的程式碼中,然後存入表單,在頁面可以查看部分日誌。這個系統並沒有此要求,因此便想到了做一個系統通用的日誌記錄,主要記錄資料有:操作時間、操作對象、操作方法、操作的一些參數以及操作結果。剛開始直接想到的是利用aspect實作aop記錄日誌,但實際應用中發現aspect並不能友善的攔截action,而是主要用作攔截service層業務。由於系統框架是基於ssh框架的,所以最終考慮使用struts2的自帶攔截器Interceptor。
什麼攔截器?
攔截器是動態攔截Action呼叫的物件。它提供了一個機制可以使開發者可以定義在一個action執行的前後執行的程式碼,也可以在一個action執行前阻止其執行。同時也是提供了一種可以提取action中可重用的部分的方式。談到攔截器,還有一個字大家應該知道-攔截器鏈(Interceptor Chain,在Struts 2中稱為攔截器棧Interceptor Stack)。攔截器鏈就是將攔截器依一定的順序聯結成一條鏈。在存取被攔截的方法或欄位時,攔截器鏈中的攔截器就會依其先前定義的順序被呼叫。
攔截器的原理和大致流程
1.ActionInvocation初始化時,根據配置,載入Action相關的所有Interc eptor。
2. 透過ActionInvocation.invoke方法呼叫Action實作時,執行Interceptor。
Interceptor將許多功能從我們的Action中獨立出來,大量減少了我們Action的程式碼,獨立出來的行為具有很好的重複使用性。 XWork、WebWork的許多功能都是有Interceptor實現,可以在設定檔中組裝Action用到的Interceptor,它會依照你指定的順序,在Action執行前後執行。
以上是詳解用Aspect實作方法出入口日誌記錄的經驗分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!