Aspect Oriented Programming(AOP)是較爲熱門的一個話題。AOP,國內大體譯做「面向方面編程」。正則表達式
「面向方面編程」,這樣的名字並非很是容易理解,且容易產生一些誤導。筆者不止一次聽到相似「OOP/OOD11即將落伍,AOP是新一代軟件開發方式」這樣的發言。顯然,發言者並無理解AOP的含義。Aspect,沒錯,的確是「方面」的意思。不過,華語傳統語義中的「方面」,大多數狀況下指的是一件事情的不一樣維度、或者說不一樣角度上的特性,好比咱們常說:「這件事情要從幾個方面來看待」,每每意思是:須要從不一樣的角度來看待同一個事物。這裏的「方面」,指的是事物的外在特性在不一樣觀察角度下的體現。而在AOP中,Aspect的含義,可能更多的理解爲「切面」比較合適。因此筆者更傾向於「面向切面編程」的譯法。編程
能夠經過預編譯方式和運行期動態代理實如今不修改源代碼的狀況下給程序動態統一添加功能的一種技術。AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,提升代碼的靈活性和可擴展性,AOP能夠說也是這種目標的一種實現。設計模式
在Spring中提供了面向切面編程的豐富支持,容許經過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務(transaction)管理)進行內聚性的開發。應用對象只實現它們應該作的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支持。安全
日誌記錄,性能統計,安全控制,事務處理,異常處理等等架構
將日誌記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來,經過對這些行爲的分離,咱們但願能夠將它們獨立到非指導業務邏輯的方法中,進而改變這些行爲的時候不影響業務邏輯的代碼。性能
AOP 是一個概念,一個規範,自己並無設定具體語言的實現,這實際上提供了很是廣闊的發展的空間。AspectJ是AOP的一個很悠久的實現,它可以和 Java 配合起來使用。編碼
介紹 AspectJ 的使用和編碼不是本文的目的,你能夠在 Google 上找到不少有關它的材料。spa
這裏只是重溫 AspectJ 中幾個必需要了解的概念:設計
Aspect: Aspect 聲明相似於 Java 中的類聲明,在 Aspect 中會包含着一些 Pointcut 以及相應的 Advice。代理
Joint point:表示在程序中明肯定義的點,典型的包括方法調用,對類成員的訪問以及異常處理程序塊的執行等等,它自身還能夠嵌套其它 joint point。
Pointcut:表示一組 joint point,這些 joint point 或是經過邏輯關係組合起來,或是經過通配、正則表達式等方式集中起來,它定義了相應的 Advice 將要發生的地方。
Advice:Advice 定義了在 pointcut 裏面定義的程序點具體要作的操做,它經過 before、after 和 around 來區別是在每一個 joint point 以前、以後仍是代替執行的代碼。
下面要討論的這些問題,也許正是接觸了 AOP 以後所困惑的。
AOP 幫助咱們解決了新的問題沒有?
AOP 並無幫助咱們解決任何新的問題,它只是提供了一種更好的辦法,可以用更少的工做量來解決現有的一些問題,而且使得系統更加健壯,可維護性更好。同時,它讓咱們在進行系統架構和模塊設計的時候多了新的選擇和新的思路。