1. 程式人生 > 程式設計 >Spring AOP日誌框架實現過程圖解

Spring AOP日誌框架實現過程圖解

AOP日誌框架實現

JDK動態代理實現日誌框架

首先,在專案包com.ay.test 下建立業務介面類BusinessClassService,具體程式碼如下:

Spring AOP日誌框架實現過程圖解

BusinessC lassService 業務介面類可以理解為日常開發業務建立的介面類, 介面中有一個簡 單的方法doSomeThing 。然後,開發業務類的實現類BusinessClassServiceImpl,具體程式碼如下:

Spring AOP日誌框架實現過程圖解

Spring AOP日誌框架實現過程圖解

實現類BusinessClassServicelmpl 實現了BusinessClassServ ice 介面, 並實現了doSomeThing 方法,在方法中列印“ do something ......” 。接著,開發日誌介面類My Logger , 具體程式碼如下:

Spring AOP日誌框架實現過程圖解

• savelntoMethodTime : 記錄進入方法的時間。 • saveOutMethodTime : 記錄退出方法的時間。 介面類MyLogger 開發完成之後,用MyLoggerlmpl 類實現它, 具體程式碼如下:

Spring AOP日誌框架實現過程圖解

Spring AOP日誌框架實現過程圖解

MyLoggerlmpl 類實現介面MyLogger , 並實現savelntoMethodTime 和saveOutMethodTime 方法,在方法內部列印進入/退出方法的時間。 最後, 實現最重要的類MyLoggerHandler , 具體程式碼如下:

Spring AOP日誌框架實現過程圖解

Spring AOP日誌框架實現過程圖解

• lnvocationHandler : 該介面中僅定義了一個方法: public Object invoke(Object obj, Method method,Object[] args) , 在使用時,第一個引數obj 一般是指代理類, method是 被代理的方法, args為該方法的引數陣列。這個抽象方法在代理類中動態實現。 所有的程式碼開發完成之後,開發測試類MyLoggerTest 進行測試, 具體程式碼如下:

Spring AOP日誌框架實現過程圖解

• Proxy . newProxylnstance :該類即為動態代理類, static Object newProxylnstance (ClassLoader loader,Class[] interfaces,JnvocationHandler h),返回代理類的一個例項,返 回後的代理類可以當作被代理類使用。在Proxy.new Proxy Instance方法中,共有以下三 個引數: • Classloader loader: targetObject.getClass().getClassLoader()目標物件通過getClass 方法獲取類的所有資訊後,呼叫getClassLoader()方法來獲取類載入器。獲取類力口載 器後,可以通過這個型別的載入器,在程式執行時,將生成的代理類力口載到JVM即 Java虛擬機器中,以使執行時需要。 •Class[] interfaces: targetObject.getClass().getinterfaces()獲取被代理類的所有介面信 息,以便於生成的代理類可以具有代理類介面中的所有方法。 • lnvocationHandler h : 使用動態代理是為了更好地擴充套件, 比如在方法之前做什麼操 作,之後做什麼操作,這個時候這些公共的操作可以統一交給代理類去做。此時需 要呼叫實現了InvocationHandler 類的一個回撥方法。

執行測試類的ma in 方法,便可以在Intellij IDEA 控制檯檢視列印資訊,具體資訊如下:

Spring AOP日誌框架實現過程圖解

以上就是利用動態代理模式實現簡單的日誌框架, 具體的結構如圖

Spring AOP日誌框架實現過程圖解

這裡總結一下JDK 動態代理的一般實現步驟:

( l )建立一個實現InvocationHandler 介面的類MyLoggerHandler,它必須實現invoke 方法。

(2 )建立被代理的類BusinessClassService 以及介面BusinessClassServicelmpl 。

(3 )呼叫Proxy 的靜態方法newProxyInstance ,建立一個代理類。

( 4 )通過代理類呼叫方法。

spring aop實現日誌框架

使用Spring AOP 的註解方式實現日誌框架是非常簡單的。首先,在配置檔案 spring-mvc且nl 中新增配置, 具體程式碼如下:

<aop:aspectj-autoproxy proxy-target-class="true">

</aop:aspectj-autoproxy>: 宣告自動為Spring容器中那些配置@aspectJ切面的bean建立 代理,織入切面。<aop : aspectj -autoproxy />有一個proxy-target-class屬性,預設為fal se,表示使用JDK動態代理織入增強,當配置poxy-target-class 為true 時,表示使用CGLib動 態代理技術織入增強。不過即使設定proxy-target-class 為fa lse ,如果目標類沒有宣告接 口,則Spring將自動使用CGLib動態代理。

配置新增完成之後,要定義一個切面Loglnterceptor ,具體程式碼如下:

Spring AOP日誌框架實現過程圖解

Spring AOP日誌框架實現過程圖解

• @Aspect : 標識Loglntercepto r類為一個切面,供容器讀取. • @Before : 在所攔截方法執行之前執行before 方法。 • @After:在所攔截方法執行之後執行after方法。 • @Around :可以同時在所攔截方法的前後執行一段邏輯。 • execution 切入點指示符: Spring AOP日誌框架實現過程圖解表示在controller 包中定義的任意方法 的執行。execution 切入點指示符執行表示式的格式如下:

Spring AOP日誌框架實現過程圖解

翻譯為:

Spring AOP日誌框架實現過程圖解

其中黑色字型部分不能省略,各部分都支援萬用字元“*”來匹配全部。比較特殊的為形參 表部分,其支援以下兩種萬用字元:

Spring AOP日誌框架實現過程圖解

例如:

Spring AOP日誌框架實現過程圖解

下面舉一些execution 的使用例項,具體內容見表3 -3 。

Spring AOP日誌框架實現過程圖解

Spring AOP日誌框架實現過程圖解

切面類Loglnterceptor 開發完成之後, 重新啟動springmvc-mybatis-book 專案,專案成功啟 動後,在瀏覽器輸入網址: http: //localbost: 8080/user/findAll , 便可以在lntellij IDEA 開發工具的 控制檯看到如下的列印資訊:

Spring AOP日誌框架實現過程圖解

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。