



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
SpringAOP的底層實現技術一-JDK動態代理2008-12-3014:57JDK動態代理在JDK1.3以后提供了動態代理的技術,允許開發者在運行期創建接口的代理實例。在Sun剛推出動態代理時,還很難想象它有多大的實際用途,現在我們終于發現動態代理是實現AOP的絕好底層技術。JDK的動態代理主要涉及到java.lang.reflect包中的兩個類:Proxy和InvocationHandler。其中InvocationHandler是一個接口,可以通過實現該接口定義橫切邏輯,在并通過反射機制調用目標類的代碼,動態將橫切邏輯和業務邏輯編織在一起。而Proxy為InvocationHandler實現類動態創建一個符合某一接口的代理實例。這樣講一定很抽象,我們馬上著手動用Proxy和InvocationHandler這兩個魔法戒對上一節中的性能監視代碼進行AOP式的改造。首先,我們從業務類ForumServiceImpl中刪除性能監視的橫切代碼,使ForumServiceImpl只負責具體的業務邏輯,如所示:代碼清單5ForumServiceImpl:移除性能監視橫切代碼xy;publicclassForumServiceImplimplementsForumService{publicvoidremoveTopic(inttopicId){①System.out.println("模擬刪除Topic記錄:"+topicId);try{Thread.currentThread().sleep(20);}catch(Exceptione){thrownewRuntimeException(e);}②}publicvoidremoveForum(intforumId){①System.out.println("模擬刪除Forum記錄:"+forumId);try{Thread.currentThread().sleep(40);}catch(Exceptione){thrownewRuntimeException(e);}②}}在代碼清單5中的①和②處,原來的性能監視代碼被移除了,我們只保留了真正的業務邏輯。從業務類中移除的橫切代碼當然還得找到一個寄居之所,InvocationHandler就是橫切代碼的家園樂土,我們將性能監視的代碼安置在PerformaceHandler中,如代碼清單6所示:代碼清單6PerformaceHxy;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;publicclassPerformaceHandlerimplementsInvocationHandler{privateObjecttarget;publicPerformaceHandler(Objecttarget){//①target為目標的業務類this.target=target;}publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{PerformanceMonitor.begin(target.getClass().getName()+"."+method.getName());Objectbj=method.invoke(target,args);//②通過反射方法調用目標業務類的業務方法PerformanceMonitor.end();returnobj;}}粗體部分的代碼為性能監視的橫切代碼,我們發現,橫切代碼只出現一次,而不是原來那樣星灑各處。大家注意②處的method.invoke(),該語句通過反射的機制調用目標對象的方法,這樣InvocationHandler的invoke(Objectproxy,Methodmethod,Object[]args)方法就將橫切代碼和目標業務類代碼編織到一起了,所以我們可以將InvocationHandler看成是業務邏輯和橫切邏輯的編織器。下面,我們對這段代碼做進一步的說明。首先,我們實現InvocationHandler接口,該接口定義了一個invoke(Objectproxy,Methodmethod,Object[]args)的方法,proxy是代理實例,一般不會用到;method是代理實例上的方法,通過它可以發起對目標類的反射調用;args是通過代理類傳入的方法參數,在反射調用時使用。此外,我們在構造函數里通過target傳入真實的目標對象,如①處所示,在接口方法invoke(Objectproxy,Methodmethod,Object[]args)里,將目標類實例傳給method.invoke()方法,通過反射調用目標類方法,如②所示。下面,我們通過Proxy結合PerformaceHandler創建ForumService接口的代理實例,如代碼清單7所示:代碼清單7TestForumService:創建代理實例xy;importjava.lang.reflect.Proxy;publicclassTestForumService{publicstaticvoidmain(String[]args){ForumServicetarget=newForumServiceImpl();//①目標業務類//②將目標業務類和橫切代碼編織到一起PerformaceHandlerhandler=newPerformaceHandler(target);//③為編織了目標業務類邏輯和性能監視橫切邏輯的handler創建代理類ForumServiceproxy=(ForumService)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),handler);//④操作代理實例proxy.removeForum(10);proxy.removeTopic(1012);}}上面的代碼完成了業務類代碼和橫切代碼編織和接口代理實例生成的工作,其中在②處,我們將ForumService實例編織為一個包含性能監視邏輯的PerformaceHandler實例,然后在③處,通過Proxy的靜態方法newProxylnstance()為融合了業務類邏輯和性能監視邏輯的handler創建一個ForumService接口的代理實例,該方法的第一個入參為類加載器,第二個入參為創建的代理實例所要實現的一組接口,第三個參數是整合了業務邏輯和橫切邏輯的編織器對象。按照③處的設置方式,這個代理實例就實現了目標業務類的所有接口,也即ForumServicelmpl的ForumService接口。這樣,我們就可以按照調用ForumService接口的實例相同的方式調用代理實例,如④所示。運行以上的代碼,輸出以下的信息:beginmonitor...模擬刪除Forum記錄:10xy.ForumServiceImpl.removeForum花費47毫秒。beginmonitor...模擬刪除Topic記錄:1012xy.ForumServiceImpl.removeTopic花費26毫秒。我們發現,程序的運行效果和直接在業務類中編寫性能監視邏輯的效果一致,但是在這里,原來分散的橫切邏輯代碼已經被我們抽取到PerformaceHandler中。當其它業務類(如UserService、SystemService等)的業務方法也需要使用性能監視時,我們只要按照以上的方式,分別為它們創建代理對象就可以了。下面,我們用時序圖描述調用關系,進一步代理實例的本質,如
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 食品冷鏈物流溫控技術進步與2025年質量監管政策分析報告
- 2025年農業產業集群區域合作與產業布局優化報告
- 2025年工業機器人柔性制造系統應用效果評估與優化方案報告
- 2025年生態修復工程中生態系統服務功能評估與生態修復技術路徑優化報告
- 潮玩市場分析報告:2025年收藏價值與文化影響力的實證研究
- 2025年鈾礦資源分布與核能產業市場競爭力分析報告
- 2025年儲能電池熱管理技術產業政策優化與實施路徑報告
- 藝術品數字化交易平臺市場風險預警與應對策略報告
- 2025-2030中國食品電商行業消費動態及競爭趨勢預測報告
- 2025-2030中國阿米替林透皮凝膠行業應用態勢與競爭動態預測報告
- LY/T 1184-1995橡膠木鋸材
- GB/T 9113-2010整體鋼制管法蘭
- GB/T 18983-2017淬火-回火彈簧鋼絲
- GB 7000.1-2015燈具第1部分:一般要求與試驗
- 4M變更控制程序
- 2023年麻陽苗族自治縣事業單位招聘筆試模擬試題及答案解析
- 2023屆高考語文復習:小說之情節 課件
- 2021國開電大操作系統形考任務 實驗報告-進程管理實驗
- 重危患者護理計劃的制定與實施
- 重慶市各縣區鄉鎮行政村村莊村名居民村民委員會明細及行政區劃代碼
- 小學高段語文審題能力的培養
評論
0/150
提交評論