面向切面程式設計AOP

akbarken發表於2013-10-10

一、概念:

Aspect Oriented Programming(AOP),面向切面程式設計:

AOP主要實現的目的是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。比如我們最常見的就是日誌記錄了,舉個例子,我們現在提供一個服務查詢學生資訊的,但是我們希望記錄有誰進行了這個查詢。如果按照傳統的OOP的實現的話,那我們實現了一個查詢學生資訊的服務介面(StudentInfoService)和其實現類(StudentInfoServiceImpl.java),同時為了要進行記錄的話,那我們在實現類(StudentInfoServiceImpl.java)中要新增其實現記錄的過程。這樣的話,假如我們要實現的服務有多個呢?那就要在每個實現的類都新增這些記錄過程。這樣做的話就會有點繁瑣,而且每個實現類都與記錄服務日誌的行為緊耦合,違反了物件導向的規則。那麼怎樣才能把記錄服務的行為與業務處理過程中分離出來呢?看起來好像就是查詢學生的服務自己在進行,但卻是背後日誌記錄對這些行為進行記錄,並且查詢學生的服務不知道存在這些記錄過程,這就是我們要討論AOP的目的所在。AOP的程式設計,好像就是把我們在某個方面的功能提出來與一批物件進行隔離,這樣與一批物件之間降低了耦合性,可以就某個功能進行程式設計。

通俗理解:

	AOP就是在你編寫程式(大部分是已有的)的基礎上,新增一個路障一樣的東西,當執行到這個路障時就停下,做路障這裡的工作,這樣的話,一個程式就分為幾個不一樣的層面。通過減少程式碼重複模組從而幫助開發人員提高工作效率。定義一套Java語言的擴充套件系統,使開發者可以方便的進行面向方面的開發,這套擴充套件系統被稱為Aspectj

通過IoC模式(Inversion of Control,控制反轉模式)來實現AOP,通常被稱為Spring AOP

AOP對AspectJ的支援:

使用AspectJ註解:
1,啟用對AspectJ的支援:
通過在Spring的配置中引入下列元素來啟用Spring對AspectJ的支援:
<aop:aspectj-autoproxy />
或者(如果不是使用XSD的話)
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
2,宣告一個帶有@Aspect註解的類,在這個類中宣告那些方法需要被'關注'(利用@Pointcut),在那些時機點進行關注(利用@Before,@AfterReturning等等...),執行'切入'的方法
3,在Spring的配置檔案中定義這個'切面'類:任意帶有一個@Aspect切面(擁有@Aspect註解)的bean都將被Spring自動識別並用於配置在Spring AOP.
4,使用被Spring管理的bean,在執行被'關注'的方法時,'切入'的方法就會被執行.

一個完整的例子參考:http://blog.csdn.net/kkdelta/article/details/5515882

相關文章