目标:生成一個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