天天看點

【spring架構】利用動态代理實作AOP

目标:生成一個userdao的代理,然後在代理執行的過程中,把關于日志記錄的邏輯加進去。

userdao.java:

userdaoimpl.java:

現在需要要在執行userdaoimpl的save方法之前和之後執行logintercept類的beforemethod與aftermethod方法賴建立日志。

首先讓logintercept類實作動态代理的接口invocationhandler

然後重寫invoke方法。

測試方法:

測試結果:

save start...

add success!!

save end...

當你有一件事情,需要在多個方法上面都要加相同的業務邏輯的時候,用動态代理會幫你省好多事情。

剖析一下動态代理的實作:

得到的是userdao接口嗎?測試一下:

system.out.println(userdaoproxy.getclass());

得到:class $proxy4

說明userdaoproxy并不是userdao接口,而是jdk的一個動态代理類$proxy4,它是根據你傳給它的參數中的接口那一項,得到接口本身,繼而拿到接口的所有方法,哪個方法調用都會把接口本身傳給invocationhandlder(li的invoke方法拿到)。

好了,我們寫完了動态代理的aop,但是,到底什麼是aop(aspect-oriented-programming)面向切面程式設計呢?

你會發現,我們正常的程式寫起來就是一條直線,比如:

接受使用者名密碼--->連接配接資料庫--->建立xxx對象--->存儲--->建立日志--->end

而面向切面程式設計就好像我們在中間"咔嚓"砍掉一刀,在上面加上邏輯,在另外一個地方"咔嚓"一刀,也在上面加邏輯,而方法自己本身并不知道。

面向切面程式設計是面向對象程式設計的有一偉大思想。應用的地方太多,權限、日志、檢查、事務(可以在crud方法前加上transiention.start(),事務結束後加上transiention.commit())、異常的管理(單獨寫一個業務邏輯,想給哪個方法加異常管理就加)。

比如權限,再給每個jsp檔案設權限的時候,在每個jsp檔案開始的時候要做個檢查,正常的寫jsp檔案或方法,我們的業務邏輯才是我們的主要内容,但是由于要檢查權限,非要在前面加上檢查權限的代碼,代碼會很繁瑣,不會專注于特定的内容了,而且去掉它的時候會很麻煩。

但是利用面向切面的程式設計,就不會産生這些問題,而且這些加上的業務邏輯可以利用spring的配置檔案輕松的去掉或者加上。

現在是實作了invocationhandler,如果利用spring,不用實作invocationhandler{接口也可以,它就是使用了直接生成二進制碼,用繼承。

sturts2中的攔截器使用的就是aop切面程式設計

順便說一下,一般寫程式推薦面向接口程式設計。

轉載請注明出處:http://blog.csdn.net/acmman/article/details/44276427