摘要:Spring AOP模塊直接將面向切面的編程功能集成到了Spring框架中,所以可以很容易的使Spring框架管理的任何對象支持AOP。該文以實際項目為例,闡述了利用AOP的技術(shù)優(yōu)勢和應(yīng)用價值。
關(guān)鍵詞:Spring;Web;AOP;IoC
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2009)26-7420-02
The Research of AOP on Spring Framework
WANG Xiao-jun1, ZHANG Dian-long2
(1.Department of Computer Engineering, Shandong College of Information and Technical, Weifang 261061, China; 2.Department of Software Engineering, Shandong College of Information and Technical, Weifang 261061, China)
Abstract: Spring is a programming framework, that implements the techonology about Aspect-Oriented Programming. So anyone can make the Spring framework that manage any object to support AOP easily. This paper bases on the realized project,that it has expatiated on the technological advantage and application value by using AOP.
Key words: Spring; Web; AOP; IoC
當(dāng)Java在Web開發(fā)領(lǐng)域獲得前所未有的成功之后,Web程序員紛紛從PHP、ASP等技術(shù)陣營轉(zhuǎn)移到Java陣營。然而隨后幾年Java程序員在開發(fā)EJB時,發(fā)現(xiàn)它過于復(fù)雜,且難以進行單元測試,恰巧這個時候,.NET技術(shù)開始發(fā)展起來。Java陣營迫切需要一個實用的框架來加速Web和企業(yè)級軟件的開發(fā),以Spring為代表的輕量級框架應(yīng)運而生。
1 開源框架 Spring簡介
1.1 Spring簡介
Spring是一個非常優(yōu)秀的輕量級開源框架,由RodJohnson創(chuàng)建,其組成部分從Web MVC一直到數(shù)據(jù)持久化訪問,是一個完整程序結(jié)構(gòu)體系。簡單地說,Spring是一個輕量級的IoC和AOP容器框架,通過Spring的IoC容器,我們將關(guān)注點放在需要實現(xiàn)的業(yè)務(wù)邏輯上。對AOP的支持則能動態(tài)的增強業(yè)務(wù)方法。Spring既是全面的又是模塊化的。Spring有分層的體系結(jié)構(gòu),這意味著開發(fā)者能選擇使用它任何一個獨立的部分,而它的架構(gòu)又是內(nèi)部一致。Spring不會給你的工程添加對其他的框架依賴。Spring可以稱得上是個一站式解決方案,提供了一個典型應(yīng)用所需要的大部分基礎(chǔ)架構(gòu)。它還涉及到了其他framework沒有考慮到的內(nèi)容。Spring不強迫你必須在每一層中必須使用Spring,因為它模塊化的很好,允許你根據(jù)自己的需要選擇使用它的某一個模塊。
Spring之所以能迅速在Java開發(fā)人員中流行,是因為Spring具有以下特點。
1)設(shè)計良好的分層結(jié)構(gòu),使得開發(fā)人員可以很簡單的進行擴充,并引入先進的設(shè)計理念。
2)以IoC為核心,促使開發(fā)人員面向接口編程,可以養(yǎng)成良好的編程習(xí)慣,從而便于程序的擴充和維護。
3)良好的架構(gòu)設(shè)計,使得應(yīng)用程序盡可能的依賴應(yīng)用程序的環(huán)境,從而使應(yīng)用脫離了環(huán)境的影響。
4)Spring能夠代替EJB。如果開發(fā)人員原來使用EJB,那么使用Spring后還可以繼續(xù)使用EJB。如果從頭開始開發(fā)應(yīng)用程序,則使用Spring提供的功能就可以代替EJB。
5)Spring MVC很好的實現(xiàn)了MVC2,并提供了很簡單的對國際化開發(fā)與資源的支持,而且可以與Spring提供的IoC和AOP聯(lián)系起來。
6)Spring可以與其他框架良好的結(jié)合,例如Struts、Hibernate等結(jié)合,這使應(yīng)用開發(fā)更為容易。
1.2 Spring AOP原理
AOP全稱Aspect-Oriented Programming 中文直譯為面向切面(方面)編程,用于解決OOP中無法很好解決的問題。它從另一個角度來考慮程序結(jié)構(gòu)以完善面向?qū)ο缶幊蹋琌OP將應(yīng)用程序分解成各個層次的對象,而AOP將程序分解成各個方面或者說關(guān)注點,這使得可以模塊化諸如事務(wù)管理等這些橫切多個對象的關(guān)注點。
大多數(shù)AOP定義都是關(guān)于如何使交叉業(yè)務(wù)模塊化。如圖2所示顯示的是業(yè)務(wù)交叉的示意圖。如果由于需求的變更,我們要取消一部分方法中的開啟事務(wù)或結(jié)束事務(wù)處理的功能,此時,我們就需要手工逐一刪除這些方法中的事務(wù)處理語句。使用AOP可以在一個地方定義通用功能,只要聲明是定義何時何地應(yīng)用這些功能,就可以在需要新功能的地方修改代碼。
2 Spring中的AOP實現(xiàn)及應(yīng)用
Spring框架中包含一個AOP實現(xiàn),是Spring框架的重要組成部分,實現(xiàn)了AOP規(guī)范約定的接口。Spring中的AOP主要使用基于攔截器的方式,能夠創(chuàng)建連接點,能夠?qū)Ψ椒ㄕ{(diào)用連接點進行相關(guān)的攔截。Spring使用純Java的方式來實現(xiàn)AOP,Spring AOP的植入過程是在運行是由Spring使用Java的代理機制來完成的。Spring AOP依賴于Spring的核心IoC容器,并與容器融為一體,因此可以在配置文件中聲明應(yīng)用AOP功能。
在Spring配置文件中分別配置通知、切入點、切面,然后使用代理工廠Bean等配置業(yè)務(wù)對象的代理,按部就班的進行Spring AOP的配置。
2.1 創(chuàng)建通知
Spring的連接點是建立在方法攔截基礎(chǔ)上的,這意味著Spring通知可以在方法調(diào)用的各個地方植入系統(tǒng)中。因為Spring可以在方法執(zhí)行的各個地方植入通知,所以通知有不同的類型。
2.2 定義切入點
切入點是根據(jù)類的方法是否滿足特定的規(guī)則,來決定是否在合適的地方植入通知。切入點的描述重點是方法的描述。方法的描述涉及到幾個方面,包括方法名稱的描述、所帶的參數(shù)、所處的類、執(zhí)行的流程等。
Spring框架中的切入點主要分為靜態(tài)切入點和動態(tài)切入點。其中靜態(tài)切入點基于方法和目標類進行切入點判斷而不考慮方法的參數(shù)。在大多數(shù)情況下,靜態(tài)切入點是高效的、最好的選擇。Spring只在第一次調(diào)用方法時執(zhí)行靜態(tài)切入點,以后每次調(diào)用這個方法時就不需要再執(zhí)行,所以性能比動態(tài)切入點好。
2.3 定義代理
代理的工作機制很簡單,就是當(dāng)我們需要使用某一個類時,由Spring通過一定的代理機制,創(chuàng)建一個我們所需類代理的對象,代理對象跟實際對象實現(xiàn)相同的接口或者是實際對象類的一個子類。當(dāng)執(zhí)行代理對象上的一個方法時,其交由一個回調(diào)對象來處理,而我們可以自定義這個回調(diào)對象,從而加入自定義的程序邏輯,即AOP中通知。因此,在系統(tǒng)中就需要一個負責(zé)根據(jù)一定的策略,創(chuàng)建代理對象的代理工廠角色,在Spring的AOP實現(xiàn)中,ProxyFactoryBean正是扮演了這個角色。
3 AOP應(yīng)用實例
考慮一個超級瑪麗游戲設(shè)計,在游戲的初始化后,人物每次前進一步都可能碰見方塊的阻擋,瑪麗是否打碎磚塊?定義GameRole接口,利用四個方法表示瑪麗的行走。四個方法都是簡單的坐標變換,而在游戲中重要的就是瑪麗在行走的過程中會遇到一些方塊,打碎這些方塊會爆出一些東西,也就是說四個方法都應(yīng)該調(diào)用一個doBox()方法來表示打碎物品后的處理。
在四個方法中都應(yīng)有doBox()方法,而該方法可能有很多的內(nèi)容,同時瑪麗還有可能增加飛行和游泳等動作,這樣就造成了大量的代碼重復(fù),這個時候就要考慮使用AOP來解決了。
編寫一個切面,定義doBox方法作為行走方法的后置通知;首先定義一個名為afterPointcut的切點;接著定義一個后置通知;編寫配置文件game-config.xml:
…
…
最后定義一個游戲運行代碼。
當(dāng)然這只是一個簡單的模擬游戲,實際還有很多問題這里沒有解決,不過只要熟悉了AOP的使用,一定可以將游戲制作的是否完善。經(jīng)過這樣設(shè)計的系統(tǒng),符合MVC設(shè)計模式,合理的劃分了系統(tǒng)層次,實現(xiàn)了松散耦合的思想。同時加快了系統(tǒng)的開發(fā)速度,增加了系統(tǒng)整體部署的可伸縮性,改善了系統(tǒng)的應(yīng)用性能。
4 結(jié)束語
本文探討了一種新的編程思想和開發(fā)技術(shù),借助Spring AOP,使得Spring成為成功的J2EE架構(gòu)框架,它使得開發(fā)人員可以集中關(guān)注于系統(tǒng)的核心商業(yè)邏輯,使用AOP來靈活處理一些具有橫切性質(zhì)的系統(tǒng)級服務(wù),已經(jīng)成為一種非常適用的解決方案。
參考文獻:
[1] 張國平,萬仲保,劉高原.Spring AOP框架在J2EE中的應(yīng)用[J].微計算機信息,2007(36):254.
[2] 羅時飛.精通Spring2.0[M].北京:電子工業(yè)出版社,2007:43-198.
[3] 石丹丹.面向方面編程模式的探討[J].武漢理工大學(xué)學(xué)報,2005,27(1):93-95.
[4] 張鈺.精通Spring 2.x Java Web開發(fā)[M].北京:電子工業(yè)出版社,2008:76-115.
[5] Harrop R,Machacek J.Spring專業(yè)開發(fā)指南[M].北京:電子工業(yè)出版社,2006:49-182.