




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
北大青鳥中關(guān)村AOP(面向切面編程)可以說是OOP(Object-OrientedPrograming,面向?qū)ο缶幊蹋┑难a充和完善。OOP引入封裝、繼承和多態(tài)性等概念來建立一種對象層次結(jié)構(gòu),用以模擬公共行為的一個集合。當我們需要為分散的對象引入公共行為的時候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關(guān)系,但并不適合定義從左到右的關(guān)系。例如日志功能。日志代碼往往水平地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關(guān)系。對于其他類型的代碼,如安全性、異常處理和透明的持續(xù)性也是如此。這種散布在各處的無關(guān)的代碼被稱為橫切(cross-cutting)代碼,在OOP設計中,它導致了大量代碼的重復,而不利于各個模塊的重用。而AOP技術(shù)則恰恰相反,它利用一種稱為“橫切”的技術(shù),剖解開封裝的對象內(nèi)部,并將那些影響了多個類的公共行為封裝到一個可重用模塊,并將其名為“Aspect",即方面。所謂“方面”,簡單地說,就是將那些與業(yè)務無關(guān),卻為業(yè)務模塊所共同調(diào)用的邏輯或責任封裝起來,便于減少系統(tǒng)的重復代碼,降低模塊間的耦合度,并有利于未來的可操作性和可維護性。AOP代表的是一個橫向的關(guān)系,如果說‘對象”是一個空心的圓柱體,其中封裝的是對象的屬性和行為;那么面向方面編程的方法,就仿佛一把利刃,將這些空心圓柱體剖開,以獲得其內(nèi)部的消息。而剖開的切面,也就是所謂的方面”了。然后它又以巧奪天功的妙手將這些剖開的切面復原,不留痕跡。使用“橫切”技術(shù),AOP把軟件系統(tǒng)分為兩個部分:核心關(guān)注點和橫切關(guān)注點。業(yè)務處理的主要流程是核心關(guān)注點,與之關(guān)系不大的部分是橫切關(guān)注點。橫切關(guān)注點的一個特點是,他們經(jīng)常發(fā)生在核心關(guān)注點的多處,而各處都基本相似。北大青鳥中關(guān)村比如權(quán)限認證、日志、事務處理。Aop的作用在于分離系統(tǒng)中的各種關(guān)注點,將核心關(guān)注點和橫切關(guān)注點分離開來。正如Avanade公司的高級方案構(gòu)架師AdamMagee所說,AOP的核心思想就是“將應用程序中的商業(yè)邏輯同對其提供支持的通用服務進行分離?!睂崿F(xiàn)AOP的技術(shù),主要分為兩大類:一是采用動態(tài)代理技術(shù),利用截取消息的方式,對該消息進行裝飾,以取代原有對象行為的執(zhí)行;二是采用靜態(tài)織入的方式,引入特定的語法創(chuàng)建“方面”,從而使得編譯器可以在編譯期間織入有關(guān)“方面”的代碼。然而殊途同歸,實現(xiàn)AOP的技術(shù)特性卻是相同的,分別為:1、joinpoint(連接點):是程序執(zhí)行中的一個精確執(zhí)行點,例如類中的一個方法。它是一個抽象的概念,在實現(xiàn)AOP時,并不需要去定義一個joinpointo2、pointcut(切入點):本質(zhì)上是一個捕獲連接點的結(jié)構(gòu)。在AOP中,可以定義一個pointcut,來捕獲相關(guān)方法的調(diào)用。3、advice(通知):是pointcut的執(zhí)行代碼,是執(zhí)行“方面”的具體邏輯。4、aspect(方面):pointcut和advice結(jié)合起來就是aspect,它類似于OOP中定義的一個類,但它代表的更多是對象間橫向的關(guān)系。5.introduce(引入):為對象引入附加的方法或?qū)傩?,從而達到修改對象結(jié)構(gòu)的目的。有的AOP工具又將其稱為mixino上述的技術(shù)特性組成了基本的AOP技術(shù),大多數(shù)AOP工具均實現(xiàn)了這些技術(shù)。它們也可以是研究AOP技術(shù)的基本術(shù)語。2.2.2橫切技術(shù)北大青鳥中關(guān)村“橫切”是AOP的專有名詞。它是一種蘊含強大力量的相對簡單的設計和編程技術(shù),尤其是用于建立松散耦合的、可擴展的企業(yè)系統(tǒng)時。橫切技術(shù)可以使得AOP在一個給定的編程模型中穿越既定的職責部分(比如日志記錄和性能優(yōu)化)的操作。如果不使用橫切技術(shù),軟件開發(fā)是怎樣的情形呢?在傳統(tǒng)的程序中,由于橫切行為的實現(xiàn)是分散的,開發(fā)人員很難對這些行為進行邏輯上的實現(xiàn)或更改。例如,用于日志記錄的代碼和主要用于其它職責的代碼纏繞在一起。根據(jù)所解決的問題的復雜程度和作用域的不同,所引起的混亂可大可小。更改一個應用程序的日志記錄策略可能涉及數(shù)百次編輯——即使可行,這也是個令人頭疼的任務。在AOP中,我們將這些具有公共邏輯的,與其他模塊的核心邏輯糾纏在一起的行為稱為“橫切關(guān)注點(CrosscuttingConcern)",因為它跨越了給定編程模型中的典型職責界限。2.2.2.1橫切關(guān)注點一個關(guān)注點(concern)就是一個特定的目的,一塊我們感興趣的區(qū)域,一段我們需要的邏輯行為。從技術(shù)的角度來說,一個典型的軟件系統(tǒng)包含一些核心的關(guān)注點和系統(tǒng)級的關(guān)注點。舉個例子來說,一個信用卡處理系統(tǒng)的核心關(guān)注點是借貸/存入處理,而系統(tǒng)級的關(guān)注點則是日志、事務完整性、授權(quán)、安全及性能問題等,許多關(guān)注點 即橫切關(guān)注點(crosscuttingconcerns) 會在多個模塊中出現(xiàn)。如果使用現(xiàn)有的編程方法,橫切關(guān)注點會橫越多個模塊,結(jié)果是使系統(tǒng)難以設計、理解、實現(xiàn)和演進。AOP能夠比上述方法更好地分離系統(tǒng)關(guān)注點,從而提供模塊化的橫切關(guān)注點。北大青鳥中關(guān)村例如一個復雜的系統(tǒng),它由許多關(guān)注點組合實現(xiàn),如業(yè)務邏輯、性能,數(shù)據(jù)存儲、日志和調(diào)度信息、授權(quán)、安全、線程、錯誤檢查等,還有開發(fā)過程中的關(guān)注點,如易懂、易維護、易追查、易擴展等,圖2.1演示了由不同模塊實現(xiàn)的一批關(guān)注點組成一個系統(tǒng)。Impkmenlation
Modules圖2.1把模塊作為一批關(guān)注點來實現(xiàn)通過對系統(tǒng)需求和實現(xiàn)的識別,我們可以將模塊中的這些關(guān)注點分為:核心關(guān)注點和橫切關(guān)注點。對于核心關(guān)注點而言,通常來說,實現(xiàn)這些關(guān)注點的模塊是相互獨立的,他們分別完成了系統(tǒng)需要的商業(yè)邏輯,這些邏輯與具體的業(yè)務需求有關(guān)。而對于日志、安全、持久化等關(guān)注點而言,他們卻是商業(yè)邏輯模塊所共同需要的,這些邏輯分布于核心關(guān)注點的各處。在AOP中,諸如這些模塊,都稱為橫切關(guān)注點。應用AOP的橫切技術(shù),關(guān)鍵就是要實現(xiàn)對關(guān)注點的識別。
北大青鳥中關(guān)村如果將整個模塊比喻為一個圓柱體,那么關(guān)注點識別過程可以用三棱鏡法則來形容,穿越三棱鏡的光束(指需求),照射到圓柱體各處,獲得不同顏色的光束,最后識別出不同的關(guān)注點。如圖2.2所示:ConcentIdentifiei'Requiremen.isBusinessLogicPersisfence圖ConcentIdentifiei'Requiremen.isBusinessLogicPersisfence圖2.2關(guān)注點識別:三棱鏡法則上圖識別出來的關(guān)注點中,BusinessLogic屬于核心關(guān)注點,它會調(diào)用到Security,Logging,Persistence等橫切關(guān)注點。publicclassBusinessLogicpublicvoidSomeOperation()〃驗證安全性;Securtity關(guān)注點;〃執(zhí)行前記錄日志;Logging關(guān)注點;DoSomething();〃保存邏輯運算后的數(shù)據(jù);Persistence關(guān)注點;〃執(zhí)行結(jié)束記錄日志;Logging關(guān)注點;北大青鳥中關(guān)村AOP的目的,就是要將諸如Logging之類的橫切關(guān)注點從BusinessLogic類中分離出來。利用AOP技術(shù),可以對相關(guān)的橫切關(guān)注點封裝,形成單獨的“aspect”。這就保證了橫切關(guān)注點的復用。由于BusinessLogic類中不再包含橫切關(guān)注點的邏輯代碼,為達到調(diào)用橫切關(guān)注點的目的,可以利用橫切技術(shù),截取BusinessLogic類中相關(guān)方法的消息,例如SomeOperation()方法,然后將這些“aspect”織入到該方法中。例如圖2.3:權(quán)限控制等橫切關(guān)注點的通用邏輯后,開發(fā)人員就可以專注于核心關(guān)注點,將精力投入到解決企業(yè)的商業(yè)邏輯上來。同時,這些封裝好了的橫切關(guān)注點提供的功能,可以最大限度地復用于商業(yè)邏輯的各個部分,既不需要開發(fā)人員作特殊的編碼,也不會因為修改橫切關(guān)注點的功能而影響具體的業(yè)務功能。為了建立松散耦合的、可擴展的企業(yè)系統(tǒng),AOP應用到的橫切技術(shù),通常分為兩種類型:動態(tài)橫切和靜態(tài)橫切。2.2.2.2動態(tài)橫切北大青鳥中關(guān)村動態(tài)橫切是通過切入點和連接點在一個方面中創(chuàng)建行為的過程,連接點可以在執(zhí)行時橫向地應用于現(xiàn)有對象。動態(tài)橫切通常用于幫助向?qū)ο髮哟沃械母鞣N方法添加日志記錄或身份認證。在很多應用場景中,動態(tài)橫切技術(shù)基本上代表了AOP。動態(tài)橫切技術(shù)的核心主要包括joinpoint(連接點),pointcut(切入點),advice(通知)和aspect(方面)。在前面,我已經(jīng)概要地介紹了這些術(shù)語分別代表的含義。接下來,我將以一個具體的實例來進一步闡述它們在AOP動態(tài)橫切中實現(xiàn)的意義??紤]一個電子商務系統(tǒng),需要對訂單進行添加、刪除等管理操作。毫無疑問,在實際的應用場景中,這些行為應與權(quán)限管理結(jié)合,只有獲得授權(quán)的用戶方能夠?qū)嵤┻@些行為。采用傳統(tǒng)的設計方法,其偽代碼如下:publicclassOrderManager(privateArrayListm_Orders;publicOrderManager()(m_Orders=newArrayList();)publicvoidAddOrder(Orderorder)(if(permissions.Verify(Permission.ADMIN))(北大青鳥中關(guān)村m_Orders.Add(order);))publicvoidRemoveOrder(Orderorder)(if(permissions.Verify(Permission.ADMIN))(m_Orders.Remove(order);)))同樣的,在該電子商務系統(tǒng)中,還需要對商品進行管理,它采用了同樣的授權(quán)機制:publicclassProductManager(privateArrayListm_Products;publicProductManager()(m_Products=newArrayList();)publicvoidAddProduct(Productproduct)(if(permissions.Verify(Permission.ADMIN))北大青鳥中關(guān)村m_Products.Add(product);))publicvoidRemoveProduct(Productproduct)(if(permissions.Verify(Permission.ADMIN))(m_Products.Remove(product);)))如此以來,在整個電子商務系統(tǒng)中,核心業(yè)務包括訂單管理和商品管理,它們都需要相同的權(quán)限管理,如圖2.4所示:圖2.4電子商務系統(tǒng)的權(quán)限驗證實現(xiàn)毫無疑問,利用AOP技術(shù),我們可以分離出系統(tǒng)的核心關(guān)注點和橫切關(guān)注點,從橫向的角度,截取業(yè)務管理行為的內(nèi)部消息,以達到織入權(quán)限管理邏輯的目北大青鳥中關(guān)村的。當執(zhí)行AddOrder()等方法時,系統(tǒng)將驗證用戶的權(quán)限,調(diào)用橫切關(guān)注點邏輯,因此該方法即為AOP的joinpointe對于電子商務系統(tǒng)而言,每個需要權(quán)限驗證的方法都是一個單獨的joinpointe由于權(quán)限驗證將在每個方法執(zhí)行前執(zhí)行,所以對于這一系列joinpoint,只需要定義一個pointcut。當系統(tǒng)執(zhí)行到joinpoint處時,將根據(jù)定義去查找對應的pointcut,然后執(zhí)行這個橫切關(guān)注點需要實現(xiàn)的邏輯,即advice。而pointcut和advice,就組合成了一個權(quán)限管理aspect。aspect由于aspect是一個封裝的對象,我們可以定義這樣一個aspect:privatestaticaspectAuthorizationAspect{ }然后在這個aspect中定義pointcut,在pointcut中,定義了需要截取上下文消息的方法,例如:privatepointcutauthorizationExecution():execution(publicvoidOrderManager.AddOrder(Order))||北大青鳥中關(guān)村execution(publicvoidOrderManager.DeleteOrder(Order))||execution(publicvoidProductManager.AddProduct(Product))||execution(publicvoidProductManager.DeleteProduct(Product));由于權(quán)限驗證是在訂單管理方法執(zhí)行之前完成,因此在beforeadvice中,定義權(quán)限檢查:before():authorizationExecution()(if!(permissions.Verify(Permission.ADMIN))(thrownewUnauthorizedException();))通過定義了這樣一個完整的aspect,當系統(tǒng)調(diào)用OrderManager或ProductManager的相關(guān)方法時,就觸發(fā)了pointcut,然后調(diào)用相應的advice邏輯。如此以來,OrderManager和ProductManager模塊就與權(quán)限管理模塊完全解除了依賴關(guān)系,同時也消除了傳統(tǒng)設計中不可避免的權(quán)限判斷的重復代碼。這對于建立一個松散耦合、可擴展的系統(tǒng)軟件是非常有利的。2.2.2.3靜態(tài)橫切靜態(tài)橫切和動態(tài)橫切的區(qū)別在于它不修改一個給定對象的執(zhí)行行為。相反,它允許通過引入附加的方法字段和屬性來修改對象的結(jié)構(gòu)。此外,靜態(tài)橫切可以把擴展和實現(xiàn)附加到對象的基本結(jié)構(gòu)中。在AOP實現(xiàn)中,通常將靜態(tài)橫切稱為introduce或者mixin。北大青鳥中關(guān)村靜態(tài)橫切在AOP技術(shù)中,受到的關(guān)注相對較少。事實上,這一技術(shù)蘊含的潛力是巨大的。使用靜態(tài)橫切,架構(gòu)師和設計者能用一種真正面向?qū)ο蟮姆椒ㄓ行У亟碗s系統(tǒng)的模型。靜態(tài)橫切允許您不用創(chuàng)建很深的層次結(jié)構(gòu),以一種本質(zhì)上更優(yōu)雅、更逼真于現(xiàn)實結(jié)構(gòu)的方式,插入跨越整個系統(tǒng)的公共行為。尤其是當開發(fā)應用系統(tǒng)時,如果需要在不修改原有代碼的前提下,引入第三方產(chǎn)品和API庫,則靜態(tài)橫切技術(shù)將發(fā)揮巨大的作用。舉例來說,當前已經(jīng)實現(xiàn)了一個郵件收發(fā)系統(tǒng),其中類Mail完成了收發(fā)郵件的功能。但在產(chǎn)品交付后,發(fā)現(xiàn)該系統(tǒng)存在缺陷,在收發(fā)郵件時,未曾實現(xiàn)郵件地址的驗證功能。現(xiàn)在,第三方產(chǎn)品已經(jīng)提供了驗證功能的接口IValidatable:publicinterfaceIValidatable(boolValidateAddress();)我們可以利用設計模式中的Adapter模式,來完成對第三方產(chǎn)品API的調(diào)用。我們可以定義一個新的類MailAdapter,該類實現(xiàn)了IValidatable接口,同時繼承了Mail類:publicclassMailAdapter:Mail,IValidatable(publicboolValidateAddress()(if(this.getToAddress()!=null)(returntrue;北大青鳥中關(guān)村)else(returnfalse;)))通過引入MailAdapter類,原來Mail對象完成的操作,將全部被MailAdapter對象取代。然而,此種實現(xiàn)方式雖然能解決引入新接口的問題,但類似下面的代碼,卻是無法編譯通過的:Mailmail=newMail();IValidatablevalidate=((IValidatable)mail).ValidateAddress();必須將第一行代碼作如下修改:Mailmail=newMailAdapter();利用AOP的靜態(tài)橫切技術(shù),可以將IValidatable接口織入到原有的Mail類中,這是一種非常形象的introduce功能,其實現(xiàn)仍然是在aspect中完成:importcom.acme.validate.Validatable;publicaspectMailValidateAspect(declareparents:MailimplementsIValidatable;北大青鳥中關(guān)村publicbooleanMail.validateAddress()(if(this.getToAddress()!=null)(returntrue;)else(returnfalse;)))靜態(tài)橫切的方法,并沒有引入類似MailAdapter的新類,而是通過定義的MailValidateAspect方面,利用橫切技術(shù)為Mail類introduce了新的方法ValidateAddress(),從而實現(xiàn)了Mail的擴展。因此如下的代碼完全可行。Mailmail=newMail();IValidatablevalidate=((IValidatable)mail).ValidateAddress();2.3AOP技術(shù)的優(yōu)勢AOP技術(shù)的優(yōu)勢是顯而易見的。在面向?qū)ο蟮氖澜缋?,人們提出了各種方法和設計原則來保障系統(tǒng)的可復用性與可擴展性,以期建立一個松散耦合、便于擴展的軟件系統(tǒng)。例如GOF提出的“設計模式”,為我們提供了設計的典范與準則。設計模式通過最大程度的利用面向?qū)ο蟮奶匦裕T如利用繼承、多態(tài),對責任北大青鳥中關(guān)村進行分離、對依賴進行倒置,面向抽象,面向接口,最終設計出靈活、可擴展、可重用的類庫、組件,乃至于整個系統(tǒng)的架構(gòu)。在設計的過程中,通過各種模式體現(xiàn)對象的行為、暴露的接口、對象間關(guān)系、以及
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 急診工作的方式計劃
- 締造良好工作氛圍的策略計劃
- 高中歷史 第5課 美國獨立戰(zhàn)爭教學實錄2 岳麓版選修2
- 統(tǒng)編版小學語文二年級下冊第15課《古詩二首》精美課件
- 愛衛(wèi)知識培訓課件社區(qū)
- 2025年濮陽貨運從業(yè)資格證考試內(nèi)容
- 2025年白山貨運從業(yè)資格證模擬考試題庫
- 2025年臨汾道路貨物運輸從業(yè)資格證模擬考試
- 八年級政治下冊 第五單元 我是中國公民 5.2《公民的權(quán)利和義務》情境探究型教學實錄 粵教版
- 2025年天津貨運從業(yè)資格證模擬考試下載
- 企業(yè)管理評審報告范本
- 湘教(湖南美術(shù))版小學美術(shù)四年級下冊全冊PPT課件(精心整理匯編)
- 《XX醫(yī)院安寧療護建設實施方案》
- 市政工程監(jiān)理規(guī)劃范本(完整版)
- (完整版)考研英美文學名詞解釋
- 第3章MAC協(xié)議
- 中小學基本辦學條件標準(建設用地校舍建設標準)
- 《醫(yī)院感染法律法規(guī)》最新PPT課件
- word公章模板
- 中西醫(yī)結(jié)合腫瘤學試卷(含答案)
- 制衣常識中英對照精講
評論
0/150
提交評論