Aspect Oriented Programming(AOP)從某種意義上說是對(duì)OOP的補(bǔ)充,因?yàn)樗€提供了模塊化的功能。但是模塊化的關(guān)鍵單元是方面而不是類。
AOP將程序邏輯分為不同的部分(稱為關(guān)注點(diǎn))。它用于通過 跨領(lǐng)域關(guān)注點(diǎn)來提高模塊化。
cross-cutting concerns是一個(gè)會(huì)影響整個(gè)應(yīng)用程序的關(guān)注點(diǎn),應(yīng)該盡可能集中在一個(gè)位置的代碼中,例如事務(wù)管理,身份驗(yàn)證,日志記錄,安全性等。
為什么使用AOP?
它提供了一種可插拔的方式,可以在實(shí)際邏輯之前,之后或周圍動(dòng)態(tài)添加附加關(guān)注點(diǎn)。假設(shè)一個(gè)類中有10個(gè)方法,如下所示:
class A{ public void m1(){...} public void m2(){...} public void m3(){...} public void m4(){...} public void m5(){...} public void n1(){...} public void n2(){...} public void p1(){...} public void p2(){...} public void p3(){...} }
從m開始有5種方法,從n開始有2種方法,從p開始有3種方法。
了解情況我必須維護(hù)日志并發(fā)送
沒有AOP的問題我們可以從m開頭的方法中調(diào)用方法(維護(hù)日志并發(fā)送通知)。在這種情況下,我們需要使用所有5種方法編寫代碼。
但是,如果客戶以后說,我不必發(fā)送通知,則需要更改所有方法。這會(huì)導(dǎo)致維護(hù)問題。
AOP解決方案我們不必從方法中調(diào)用方法?,F(xiàn)在,我們可以在類的方法中定義其他關(guān)注點(diǎn),例如維護(hù)日志,發(fā)送通知等。它的條目在xml文件中給出。
將來,如果客戶說要?jiǎng)h除通知程序功能,我們只需要在xml文件中進(jìn)行更改。因此,在AOP中維護(hù)很容易。
在以下情況下主要使用AOP:
提供聲明式企業(yè)服務(wù),例如聲明式事務(wù)管理。 它允許用戶實(shí)現(xiàn)自定義aspects。
AOP概念和術(shù)語如下:
Join point Advice Pointcut Introduction Target Object Aspect Interceptor AOP Proxy Weaving
Join point是程序中的任何點(diǎn),例如方法執(zhí)行,異常處理,字段訪問等。Spring僅支持方法執(zhí)行Join point。
Advice表示方面在特定的Join point處采取的操作。有不同類型的Advice:
Before Advice: 它在Join point之前執(zhí)行。 After Returning Advice: 在聯(lián)合點(diǎn)正常完成后執(zhí)行。 After Throwing Advice: 如果方法因引發(fā)異常而退出,則執(zhí)行。 After (finally) Advice: 無論Join point退出是正常返回還是異常返回,它都會(huì)在Join point之后執(zhí)行。 Around Advice: 它在Join point之前和之后執(zhí)行。
它是AOP的一種表達(dá)語言,它與Join point相匹配。
這意味著引入類型的其他方法和字段。它允許您向任何建議對(duì)象引入新的界面。
這是一個(gè)或多個(gè)方面建議的對(duì)象。在Spring,它也被稱為代理對(duì)象,因?yàn)镾pring AOP是使用運(yùn)行時(shí)代理實(shí)現(xiàn)的。
這是一個(gè)包含建議,Join point等的類。
這是一個(gè)僅包含一個(gè)建議的方面。
它用于實(shí)現(xiàn)由AOP框架創(chuàng)建的方面合同。在Spring框架中它將是JDK動(dòng)態(tài)代理或CGLIB代理。
這是將方面與其他應(yīng)用程序類型或?qū)ο箧溄釉谝黄鹨詣?chuàng)建建議對(duì)象的過程。編織可以在編譯時(shí),加載時(shí)或運(yùn)行時(shí)完成。 Spring AOP在運(yùn)行時(shí)執(zhí)行編織。
AOP實(shí)現(xiàn)由以下提供:
AspectJ SpringAOP JBoss AOP
Spring AOP可以通過以下三種方式使用。但是廣泛使用的方法是Spring AspectJ注釋樣式。下面給出了使用Spring AOP的3種方法:
采用Spring1.2舊樣式(基于dtd)(在Spring3中也受支持) 通過AspectJ注釋樣式 通過Spring XML配置樣式(基于模式)