什么是AOP?
AOP(Aspect-Oriented Programming,面向方面編程),可以說是OOP(Object-Oriented Programing,面向?qū)ο缶幊?#xff09;的補(bǔ)充和完善。OOP引入封裝、繼承和多態(tài)性等概念來建立一種對(duì)象層次結(jié)構(gòu),用以模擬公共行為的一個(gè)集合。當(dāng)我們需 要為分散的對(duì)象引入公共行為的時(shí)候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關(guān)系,但并不適合定義從左到右的關(guān)系。例如日志功能。日 志代碼往往水平地散布在所有對(duì)象層次中,而與它所散布到的對(duì)象的核心功能毫無關(guān)系。對(duì)于其他類型的代碼,如安全性、異常處理和透明的持續(xù)性也是如此。這種 散布在各處的無關(guān)的代碼被稱為橫切(cross-cutting)代碼,在OOP設(shè)計(jì)中,它導(dǎo)致了大量代碼的重復(fù),而不利于各個(gè)模塊的重用。
而AOP技術(shù)則恰恰相反,它利用一種稱為“橫切”的技術(shù),剖解開封裝的對(duì)象內(nèi)部,并將那些影響了多個(gè)類的公共行為封裝到一個(gè)可重用模塊,并將其名為 “Aspect”,即方面。所謂“方面”,簡(jiǎn)單地說,就是將那些與業(yè)務(wù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝起來,便于減少系統(tǒng)的重復(fù)代碼,降低 模塊間的耦合度,并有利于未來的可操作性和可維護(hù)性。AOP代表的是一個(gè)橫向的關(guān)系,如果說“對(duì)象”是一個(gè)空心的圓柱體,其中封裝的是對(duì)象的屬性和行為; 那么面向方面編程的方法,就仿佛一把利刃,將這些空心圓柱體剖開,以獲得其內(nèi)部的消息。而剖開的切面,也就是所謂的“方面”了。然后它又以巧奪天功的妙手 將這些剖開的切面復(fù)原,不留痕跡。
使用“橫切”技術(shù),AOP把軟件系統(tǒng)分為兩個(gè)部分:核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)。業(yè)務(wù)處理的主要流程是核心關(guān)注點(diǎn),與之關(guān)系不大的部分是橫切關(guān)注點(diǎn)。橫 切關(guān)注點(diǎn)的一個(gè)特點(diǎn)是,他們經(jīng)常發(fā)生在核心關(guān)注點(diǎn)的多處,而各處都基本相似。比如權(quán)限認(rèn)證、日志、事務(wù)處理。Aop 的作用在于分離系統(tǒng)中的各種關(guān)注點(diǎn),將核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)分離開來。正如Avanade公司的高級(jí)方案構(gòu)架師Adam Magee所說,AOP的核心思想就是“將應(yīng)用程序中的商業(yè)邏輯同對(duì)其提供支持的通用服務(wù)進(jìn)行分離。”
實(shí)現(xiàn)AOP的技術(shù),主要分為兩大類:一是采用動(dòng)態(tài)代理技術(shù),利用截取消息的方式,對(duì)該消息進(jìn)行裝飾,以取代原有對(duì)象行為的執(zhí)行;二是采用靜態(tài)織入的 方式,引入特定的語(yǔ)法創(chuàng)建“方面”,從而使得編譯器可以在編譯期間織入有關(guān)“方面”的代碼。然而殊途同歸,實(shí)現(xiàn)AOP的技術(shù)特性卻是相同的,分別為:
1、join point(連接點(diǎn)):是程序執(zhí)行中的一個(gè)精確執(zhí)行點(diǎn),例如類中的一個(gè)方法。它是一個(gè)抽象的概念,在實(shí)現(xiàn)AOP時(shí),并不需要去定義一個(gè)join point。
2、point cut(切入點(diǎn)):本質(zhì)上是一個(gè)捕獲連接點(diǎn)的結(jié)構(gòu)。在AOP中,可以定義一個(gè)point cut,來捕獲相關(guān)方法的調(diào)用。
3、advice(通知):是point cut的執(zhí)行代碼,是執(zhí)行“方面”的具體邏輯。
4、aspect(方面):point cut和advice結(jié)合起來就是aspect,它類似于OOP中定義的一個(gè)類,但它代表的更多是對(duì)象間橫向的關(guān)系。
5、introduce(引入):為對(duì)象引入附加的方法或?qū)傩?#xff0c;從而達(dá)到修改對(duì)象結(jié)構(gòu)的目的。有的AOP工具又將其稱為mixin。
上述的技術(shù)特性組成了基本的AOP技術(shù),大多數(shù)AOP工具均實(shí)現(xiàn)了這些技術(shù)。它們也可以是研究AOP技術(shù)的基本術(shù)語(yǔ)。
2.2.2 橫切技術(shù)
“橫切”是AOP的專有名詞。它是一種蘊(yùn)含強(qiáng)大力量的相對(duì)簡(jiǎn)單的設(shè)計(jì)和編程技術(shù),尤其是用于建立松散耦合的、可擴(kuò)展的企業(yè)系統(tǒng)時(shí)。橫切技術(shù)可以使得AOP在一個(gè)給定的編程模型中穿越既定的職責(zé)部分(比如日志記錄和性能優(yōu)化)的操作。
如果不使用橫切技術(shù),軟件開發(fā)是怎樣的情形呢?在傳統(tǒng)的程序中,由于橫切行為的實(shí)現(xiàn)是分散的,開發(fā)人員很難對(duì)這些行為進(jìn)行邏輯上的實(shí)現(xiàn)或更改。例 如,用于日志記錄的代碼和主要用于其它職責(zé)的代碼纏繞在一起。根據(jù)所解決的問題的復(fù)雜程度和作用域的不同,所引起的混亂可大可小。更改一個(gè)應(yīng)用程序的日志 記錄策略可能涉及數(shù)百次編輯——即使可行,這也是個(gè)令人頭疼的任務(wù)。
在AOP中,我們將這些具有公共邏輯的,與其他模塊的核心邏輯糾纏在一起的行為稱為“橫切關(guān)注點(diǎn)(Crosscutting Concern)”,因?yàn)樗缭搅私o定編程模型中的典型職責(zé)界限。
2.2.2.1 橫切關(guān)注點(diǎn)
一個(gè)關(guān)注點(diǎn)(concern)就是一個(gè)特定的目的,一塊我們感興趣的區(qū)域,一段我們需要的邏輯行為。從技術(shù)的角度來說,一個(gè)典型的軟件系統(tǒng)包含一些 核心的關(guān)注點(diǎn)和系統(tǒng)級(jí)的關(guān)注點(diǎn)。舉個(gè)例子來說,一個(gè)信用卡處理系統(tǒng)的核心關(guān)注點(diǎn)是借貸/存入處理,而系統(tǒng)級(jí)的關(guān)注點(diǎn)則是日志、事務(wù)完整性、授權(quán)、安全及性 能問題等,許多關(guān)注點(diǎn)——即橫切關(guān)注點(diǎn)(crosscutting concerns)——會(huì)在多個(gè)模塊中出現(xiàn)。如果使用現(xiàn)有的編程方法,橫切關(guān)注點(diǎn)會(huì)橫越多個(gè)模塊,結(jié)果是使系統(tǒng)難以設(shè)計(jì)、理解、實(shí)現(xiàn)和演進(jìn)。AOP能夠比 上述方法更好地分離系統(tǒng)關(guān)注點(diǎn),從而提供模塊化的橫切關(guān)注點(diǎn)。
例如一個(gè)復(fù)雜的系統(tǒng),它由許多關(guān)注點(diǎn)組合實(shí)現(xiàn),如業(yè)務(wù)邏輯、性能,數(shù)據(jù)存儲(chǔ)、日志和調(diào)度信息、授權(quán)、安全、線程、錯(cuò)誤檢查等,還有開發(fā)過程中的關(guān)注點(diǎn),如易懂、易維護(hù)、易追查、易擴(kuò)展等,圖2.1演示了由不同模塊實(shí)現(xiàn)的一批關(guān)注點(diǎn)組成一個(gè)系統(tǒng)。
?
圖2.1 把模塊作為一批關(guān)注點(diǎn)來實(shí)現(xiàn)
通過對(duì)系統(tǒng)需求和實(shí)現(xiàn)的識(shí)別,我們可以將模塊中的這些關(guān)注點(diǎn)分為:核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)。對(duì)于核心關(guān)注點(diǎn)而言,通常來說,實(shí)現(xiàn)這些關(guān)注點(diǎn)的模塊是 相互獨(dú)立的,他們分別完成了系統(tǒng)需要的商業(yè)邏輯,這些邏輯與具體的業(yè)務(wù)需求有關(guān)。而對(duì)于日志、安全、持久化等關(guān)注點(diǎn)而言,他們卻是商業(yè)邏輯模塊所共同需要 的,這些邏輯分布于核心關(guān)注點(diǎn)的各處。在AOP中,諸如這些模塊,都稱為橫切關(guān)注點(diǎn)。應(yīng)用AOP的橫切技術(shù),關(guān)鍵就是要實(shí)現(xiàn)對(duì)關(guān)注點(diǎn)的識(shí)別。
如果將整個(gè)模塊比喻為一個(gè)圓柱體,那么關(guān)注點(diǎn)識(shí)別過程可以用三棱鏡法則來形容,穿越三棱鏡的光束(指需求),照射到圓柱體各處,獲得不同顏色的光束,最后識(shí)別出不同的關(guān)注點(diǎn)。如圖2.2所示:
?
?圖2.2 關(guān)注點(diǎn)識(shí)別:三棱鏡法則
?
上圖識(shí)別出來的關(guān)注點(diǎn)中,Business Logic屬于核心關(guān)注點(diǎn),它會(huì)調(diào)用到Security,Logging,Persistence等橫切關(guān)注點(diǎn)。
public class BusinessLogic {public void SomeOperation(){//驗(yàn)證安全性;Securtity關(guān)注點(diǎn);//執(zhí)行前記錄日志;Logging關(guān)注點(diǎn); DoSomething();//保存邏輯運(yùn)算后的數(shù)據(jù);Persistence關(guān)注點(diǎn);//執(zhí)行結(jié)束記錄日志;Logging關(guān)注點(diǎn); } }?
AOP的目的,就是要將諸如Logging之類的橫切關(guān)注點(diǎn)從BusinessLogic類中分離出來。利用AOP技術(shù),可以對(duì)相關(guān)的橫切關(guān)注點(diǎn)封 裝,形成單獨(dú)的“aspect”。這就保證了橫切關(guān)注點(diǎn)的復(fù)用。由于BusinessLogic類中不再包含橫切關(guān)注點(diǎn)的邏輯代碼,為達(dá)到調(diào)用橫切關(guān)注點(diǎn) 的目的,可以利用橫切技術(shù),截取BusinessLogic類中相關(guān)方法的消息,例如SomeOperation()方法,然后將這些“aspect”織 入到該方法中。例如圖2.3:
? ?
圖2.3 將橫切關(guān)注點(diǎn)織入到核心關(guān)注點(diǎn)中
通過利用AOP技術(shù),改變了整個(gè)系統(tǒng)的設(shè)計(jì)方式。在分析系統(tǒng)需求之初,利用AOP的思想,分離出核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)。在實(shí)現(xiàn)了諸如日志、事務(wù)管 理、權(quán)限控制等橫切關(guān)注點(diǎn)的通用邏輯后,開發(fā)人員就可以專注于核心關(guān)注點(diǎn),將精力投入到解決企業(yè)的商業(yè)邏輯上來。同時(shí),這些封裝好了的橫切關(guān)注點(diǎn)提供的功 能,可以最大限度地復(fù)用于商業(yè)邏輯的各個(gè)部分,既不需要開發(fā)人員作特殊的編碼,也不會(huì)因?yàn)樾薷臋M切關(guān)注點(diǎn)的功能而影響具體的業(yè)務(wù)功能。
為了建立松散耦合的、可擴(kuò)展的企業(yè)系統(tǒng),AOP應(yīng)用到的橫切技術(shù),通常分為兩種類型:動(dòng)態(tài)橫切和靜態(tài)橫切。
2.2.2.2 動(dòng)態(tài)橫切
動(dòng)態(tài)橫切是通過切入點(diǎn)和連接點(diǎn)在一個(gè)方面中創(chuàng)建行為的過程,連接點(diǎn)可以在執(zhí)行時(shí)橫向地應(yīng)用于現(xiàn)有對(duì)象。動(dòng)態(tài)橫切通常用于幫助向?qū)ο髮哟沃械母鞣N方法添加日志記錄或身份認(rèn)證。在很多應(yīng)用場(chǎng)景中,動(dòng)態(tài)橫切技術(shù)基本上代表了AOP。
動(dòng)態(tài)橫切技術(shù)的核心主要包括join point(連接點(diǎn)),point cut(切入點(diǎn)),advice(通知)和aspect(方面)。在前面,我已經(jīng)概要地介紹了這些術(shù)語(yǔ)分別代表的含義。接下來,我將以一個(gè)具體的實(shí)例來進(jìn)一步闡述它們?cè)贏OP動(dòng)態(tài)橫切中實(shí)現(xiàn)的意義。
考慮一個(gè)電子商務(wù)系統(tǒng),需要對(duì)訂單進(jìn)行添加、刪除等管理操作。毫無疑問,在實(shí)際的應(yīng)用場(chǎng)景中,這些行為應(yīng)與權(quán)限管理結(jié)合,只有獲得授權(quán)的用戶方能夠?qū)嵤┻@些行為。采用傳統(tǒng)的設(shè)計(jì)方法,其偽代碼如下:
public class OrderManager {private ArrayList m_Orders;public OrderManager(){m_Orders = new ArrayList();}public void AddOrder(Order order){if (permissions.Verify(Permission.ADMIN)){m_Orders.Add(order);}}public void RemoveOrder(Order order){if (permissions.Verify(Permission.ADMIN)){m_Orders.Remove(order);}} }?
同樣的,在該電子商務(wù)系統(tǒng)中,還需要對(duì)商品進(jìn)行管理,它采用了同樣的授權(quán)機(jī)制:
public class ProductManager {private ArrayList m_Products;public ProductManager(){m_Products = new ArrayList();}public void AddProduct(Product product){if (permissions.Verify(Permission.ADMIN)){m_Products.Add(product);}}public void RemoveProduct(Product product){if (permissions.Verify(Permission.ADMIN)){m_Products.Remove(product);}} }?
如此以來,在整個(gè)電子商務(wù)系統(tǒng)中,核心業(yè)務(wù)包括訂單管理和商品管理,它們都需要相同的權(quán)限管理,如圖2.4所示:
?
圖2.4 電子商務(wù)系統(tǒng)的權(quán)限驗(yàn)證實(shí)現(xiàn)
毫無疑問,利用AOP技術(shù),我們可以分離出系統(tǒng)的核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn),從橫向的角度,截取業(yè)務(wù)管理行為的內(nèi)部消息,以達(dá)到織入權(quán)限管理邏輯的目 的。當(dāng)執(zhí)行AddOrder()等方法時(shí),系統(tǒng)將驗(yàn)證用戶的權(quán)限,調(diào)用橫切關(guān)注點(diǎn)邏輯,因此該方法即為AOP的join point。對(duì)于電子商務(wù)系統(tǒng)而言,每個(gè)需要權(quán)限驗(yàn)證的方法都是一個(gè)單獨(dú)的join point。由于權(quán)限驗(yàn)證將在每個(gè)方法執(zhí)行前執(zhí)行,所以對(duì)于這一系列join point,只需要定義一個(gè)point cut。當(dāng)系統(tǒng)執(zhí)行到j(luò)oin point處時(shí),將根據(jù)定義去查找對(duì)應(yīng)的point cut,然后執(zhí)行這個(gè)橫切關(guān)注點(diǎn)需要實(shí)現(xiàn)的邏輯,即advice。而point cut和advice,就組合成了一個(gè)權(quán)限管理aspect。
? ? ??
圖2.5 AOP動(dòng)態(tài)橫切的技術(shù)實(shí)現(xiàn)
由于aspect是一個(gè)封裝的對(duì)象,我們可以定義這樣一個(gè)aspect:
private static aspect AuthorizationAspect{……}?
然后在這個(gè)aspect中定義point cut,在point cut中,定義了需要截取上下文消息的方法(注:程序當(dāng)中應(yīng)該如何實(shí)現(xiàn)呢?),例如:
private pointcut authorizationExecution(): execution(public void OrderManager.AddOrder(Order)) || execution(public void OrderManager.DeleteOrder(Order)) || execution(public void ProductManager.AddProduct(Product)) || execution(public void ProductManager.DeleteProduct(Product));?
由于權(quán)限驗(yàn)證是在訂單管理方法執(zhí)行之前完成,因此在before advice中,定義權(quán)限檢查:
before(): authorizationExecution() {if !(permissions.Verify(Permission.ADMIN)){throw new UnauthorizedException();} }?
通過定義了這樣一個(gè)完整的aspect,當(dāng)系統(tǒng)調(diào)用OrderManager或ProductManager的相關(guān)方法時(shí),就觸發(fā)了point cut,然后調(diào)用相應(yīng)的advice邏輯。如此以來,OrderManager和ProductManager模塊就與權(quán)限管理模塊完全解除了依賴關(guān)系, 同時(shí)也消除了傳統(tǒng)設(shè)計(jì)中不可避免的權(quán)限判斷的重復(fù)代碼。這對(duì)于建立一個(gè)松散耦合、可擴(kuò)展的系統(tǒng)軟件是非常有利的。
2.2.2.3 靜態(tài)橫切
靜態(tài)橫切和動(dòng)態(tài)橫切的區(qū)別在于它不修改一個(gè)給定對(duì)象的執(zhí)行行為。相反,它允許通過引入附加的方法字段和屬性來修改對(duì)象的結(jié)構(gòu)。此外,靜態(tài)橫切可以把擴(kuò)展和實(shí)現(xiàn)附加到對(duì)象的基本結(jié)構(gòu)中。在AOP實(shí)現(xiàn)中,通常將靜態(tài)橫切稱為introduce或者mixin。
靜態(tài)橫切在AOP技術(shù)中,受到的關(guān)注相對(duì)較少。事實(shí)上,這一技術(shù)蘊(yùn)含的潛力是巨大的。使用靜態(tài)橫切,架構(gòu)師和設(shè)計(jì)者能用一種真正面向?qū)ο蟮姆椒ㄓ行?地建立復(fù)雜系統(tǒng)的模型。靜態(tài)橫切允許您不用創(chuàng)建很深的層次結(jié)構(gòu),以一種本質(zhì)上更優(yōu)雅、更逼真于現(xiàn)實(shí)結(jié)構(gòu)的方式,插入跨越整個(gè)系統(tǒng)的公共行為。尤其是當(dāng)開發(fā) 應(yīng)用系統(tǒng)時(shí),如果需要在不修改原有代碼的前提下,引入第三方產(chǎn)品和API庫(kù),則靜態(tài)橫切技術(shù)將發(fā)揮巨大的作用。
舉例來說,當(dāng)前已經(jīng)實(shí)現(xiàn)了一個(gè)郵件收發(fā)系統(tǒng),其中類Mail完成了收發(fā)郵件的功能。但在產(chǎn)品交付后,發(fā)現(xiàn)該系統(tǒng)存在缺陷,在收發(fā)郵件時(shí),未曾實(shí)現(xiàn)郵件地址的驗(yàn)證功能。現(xiàn)在,第三方產(chǎn)品已經(jīng)提供了驗(yàn)證功能的接口IValidatable:
public interface IValidatable {bool ValidateAddress(); }?
我們可以利用設(shè)計(jì)模式中的Adapter模式,來完成對(duì)第三方產(chǎn)品API的調(diào)用。我們可以定義一個(gè)新的類MailAdapter,該類實(shí)現(xiàn)了IValidatable接口,同時(shí)繼承了Mail類:
public class MailAdapter:Mail,IValidatable {public bool ValidateAddress(){if(this.getToAddress() != null){return true;}else{return false;}} }?
通過引入MailAdapter類,原來Mail對(duì)象完成的操作,將全部被MailAdapter對(duì)象取代。然而,此種實(shí)現(xiàn)方式雖然能解決引入新接口的問題,但類似下面的代碼,卻是無法編譯通過的:
Mail mail = new Mail(); IValidatable validate = ((IValidatable)mail).ValidateAddress();?
必須將第一行代碼作如下修改:
Mail mail = new MailAdapter();
利用AOP的靜態(tài)橫切技術(shù),可以將IValidatable接口織入到原有的Mail類中,這是一種非常形象的introduce功能,其實(shí)現(xiàn)仍然是在aspect中完成:
import com.acme.validate.Validatable;public aspect MailValidateAspect {declare parents: Mail implements IValidatable;public boolean Mail.validateAddress(){if(this.getToAddress() != null){return true;}else{return false;}} }?
靜態(tài)橫切的方法,并沒有引入類似MailAdapter的新類,而是通過定義的MailValidateAspect方面,利用橫切技術(shù)為Mail類introduce了新的方法ValidateAddress(),從而實(shí)現(xiàn)了Mail的擴(kuò)展。因此如下的代碼完全可行。
Mail mail = new Mail(); IValidatable validate = ((IValidatable)mail).ValidateAddress();?
2.3 AOP技術(shù)的優(yōu)勢(shì)
AOP技術(shù)的優(yōu)勢(shì)是顯而易見的。在面向?qū)ο蟮氖澜缋?#xff0c;人們提出了各種方法和設(shè)計(jì)原則來保障系統(tǒng)的可復(fù)用性與可擴(kuò)展性,以期建立一個(gè)松散耦合、便于擴(kuò) 展的軟件系統(tǒng)。例如GOF提出的“設(shè)計(jì)模式”,為我們提供了設(shè)計(jì)的典范與準(zhǔn)則。設(shè)計(jì)模式通過最大程度的利用面向?qū)ο蟮奶匦?#xff0c;諸如利用繼承、多態(tài),對(duì)責(zé)任進(jìn) 行分離、對(duì)依賴進(jìn)行倒置,面向抽象,面向接口,最終設(shè)計(jì)出靈活、可擴(kuò)展、可重用的類庫(kù)、組件,乃至于整個(gè)系統(tǒng)的架構(gòu)。在設(shè)計(jì)的過程中,通過各種模式體現(xiàn)對(duì) 象的行為、暴露的接口、對(duì)象間關(guān)系、以及對(duì)象分別在不同層次中表現(xiàn)出來的形態(tài)。然而鑒于對(duì)象封裝的特殊性,“設(shè)計(jì)模式”的觸角始終在接口與抽象中大做文 章,而對(duì)于對(duì)象內(nèi)部則無能為力。
通過“橫切”技術(shù),AOP技術(shù)就能深入到對(duì)象內(nèi)部翻云覆雨,截取方法之間傳遞的消息為我所用。由于將核心關(guān)注點(diǎn)與橫切關(guān)注點(diǎn)完全隔離,使得我們能夠 獨(dú)立的對(duì)“方面”編程。它允許開發(fā)者動(dòng)態(tài)地修改靜態(tài)的OO模型,構(gòu)造出一個(gè)能夠不斷增長(zhǎng)以滿足新增需求的系統(tǒng),就象現(xiàn)實(shí)世界中的對(duì)象會(huì)在其生命周期中不斷 改變自身,應(yīng)用程序也可以在發(fā)展中擁有新的功能。
設(shè)計(jì)軟件系統(tǒng)時(shí)應(yīng)用AOP技術(shù),其優(yōu)勢(shì)在于:
(一)在定義應(yīng)用程序?qū)δ撤N服務(wù)(例如日志)的所有需求的時(shí)候。通過識(shí)別關(guān)注點(diǎn),使得該服務(wù)能夠被更好的定義,更好的被編寫代碼,并獲得更多的功 能。這種方式還能夠處理在代碼涉及到多個(gè)功能的時(shí)候所出現(xiàn)的問題,例如改變某一個(gè)功能可能會(huì)影響到其它的功能,在AOP中把這樣的麻煩稱之為“糾結(jié) (tangling)”。
(二)利用AOP技術(shù)對(duì)離散的方面進(jìn)行的分析將有助于為開發(fā)團(tuán)隊(duì)指定一位精于該項(xiàng)工作的專家。負(fù)責(zé)這項(xiàng)工作的最佳人選將可以有效利用自己的相關(guān)技能和經(jīng)驗(yàn)。
(三)持久性。標(biāo)準(zhǔn)的面向?qū)ο蟮捻?xiàng)目開發(fā)中,不同的開發(fā)人員通常會(huì)為某項(xiàng)服務(wù)編寫相同的代碼,例如日志記錄。隨后他們會(huì)在自己的實(shí)施中分別對(duì)日志進(jìn) 行處理以滿足不同單個(gè)對(duì)象的需求。而通過創(chuàng)建一段單獨(dú)的代碼片段,AOP提供了解決這一問題的持久簡(jiǎn)單的方案,這一方案強(qiáng)調(diào)了未來功能的重用性和易維護(hù) 性:不需要在整個(gè)應(yīng)用程序中一遍遍重新編寫日志代碼,AOP使得僅僅編寫日志方面(logging aspect)成為可能,并且可以在這之上為整個(gè)應(yīng)用程序提供新的功能。
總而言之,AOP技術(shù)的優(yōu)勢(shì)使得需要編寫的代碼量大大縮減,節(jié)省了時(shí)間,控制了開發(fā)成本。同時(shí)也使得開發(fā)人員可以集中關(guān)注于系統(tǒng)的核心商業(yè)邏輯。此外,它更利于創(chuàng)建松散耦合、可復(fù)用與可擴(kuò)展的大型軟件系統(tǒng)。
參考連接:http://wayfarer.cnblogs.com/articles/241012.html
http://www.cnblogs.com/zhenyulu/zhenyulu/articles/234074.html?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/SimonHu1993/p/7103435.html
總結(jié)
- 上一篇: 你不得不掌握的thinkphp5
- 下一篇: power(乘幂)函数剖析