Spring AOP 源碼解析系列,建議你們按順序閱讀,歡迎討論java
AOP中文翻譯爲面向方面編程或面向切面編程,維基百科對它的解釋是編程
AOP指一種程序設計範型,該範型以一種稱爲aspect(切面)的語言構造爲基礎,切面是一種新的模塊化機制,用來描述分散在對象、類或函數中的橫切關注點(crosscutting concern)。設計模式
談到模塊化機制,天然會想到OOP(面向對象編程)。OOP也是一種模塊化的方法,它將數據和處理方法組合在一塊兒,擺脫了函數式中數據雜亂無章的場景,使得程序的功能整齊且清晰,而且經過設計類的繼承關係讓代碼得以重用,進一步提升開發效率。以後出現的多種設計模式使得程序設計更加便捷方便。api
然而世界是複雜的,儘管OOP已經可以解決大部分的問題,仍是存在一些非強業務相關的通用功能,明明你們都須要,一旦要歸類卻發現很複雜,每每最後寫出來一個工具類。這些功能就如同城市中的水電交通通常,滲透到家家戶戶中,卻不能交由每家每戶本身來維護。這些功能就像城市的一個個切面,須要一個統籌管理的方式。這個就是AOP造成的緣由。服務器
而什麼叫橫切關注點?先解釋下關注點,就是對軟件工程有意義的小的,可管理的可描述的軟件組成部分。太拗口了對不對,個人理解就是一個操做一個方法都是對一個關注點的實現,好比插入訂單,扣減庫存,記錄日誌等等。而有些關注點是軟件的核心功能,稱爲主關注點,好比插入訂單,有些關注點則彌散在軟件內部,好比記錄日誌,這些關注點同許多不一樣的主關注點都有交集,稱爲橫切關注點。主關注點大都經過OOP的方式去設計更加清晰,而從主關注點中分離出橫切關注點則就是面向切面的程序設計的核心概念。架構
分離關注點使得解決特定領域問題的代碼從業務邏輯中獨立出來,業務邏輯的代碼中再也不含有針對特定領域問題代碼的調用,業務邏輯同特定領域問題的關係經過切面來封裝、維護,這樣本來分散在整個應用程序中的變更就能夠很好的管理起來。框架
維基百科中對面向切面編程的操做方式給了很專業的解說。而當前已經出現了AOP的特定實現或AOP相關技術,好比模塊化
同時有一個AOP聯盟對AOP作了一個抽象和規範,造成了一個三層的表明性架構,以及一個通用的AOP API,這個API就是常用的aopalliance-api-1.0.jar。它定義了AOP的幾個通用接口:函數
而對於加強(Advice),一般又分爲如下幾種類型工具
在AOP框架的實現上,在Spring以前已經已有不少,但Spring作出了一些獨特的創新。
而Spring AOP在實現過程當中,對Aop聯盟定義的API進行了擴展和加強。
而對於AOP的具體實現,Spring AOP默認使用JDK的動態代理來代理接口。而對於沒有實現接口的類,或非接口中的方法,則經過CGLIB來實現代理。經過Advisor封裝Advice和Pointcut並初始化成攔截器鏈,當方法調用請求時,匹配其所圍繞的全部Advisor,而後按順序執行,從而達到面向切面編程的核心,分離出橫切關注點進行統一配置與管理。具體的實現方式將在以後的章節裏詳細介紹。