Spring源碼-AOP(二)-AOP概念

Spring AOP 源碼解析系列,建議你們按順序閱讀,歡迎討論java

  1. Spring源碼-AOP(一)-代理模式
  2. Spring源碼-AOP(二)-AOP概念
  3. Spring源碼-AOP(三)-Spring AOP的四種實現
  4. Spring源碼-AOP(四)-ProxyFactory
  5. Spring源碼-AOP(五)-ProxyFactoryBean
  6. Spring源碼-AOP(六)-自動代理與DefaultAdvisorAutoProxyCreator
  7. Spring源碼-AOP(七)-整合AspectJ

1.AOP概念

AOP中文翻譯爲面向方面編程或面向切面編程,維基百科對它的解釋是編程

AOP指一種程序設計範型,該範型以一種稱爲aspect(切面)的語言構造爲基礎,切面是一種新的模塊化機制,用來描述分散在對象、類或函數中的橫切關注點(crosscutting concern)。設計模式

談到模塊化機制,天然會想到OOP(面向對象編程)。OOP也是一種模塊化的方法,它將數據和處理方法組合在一塊兒,擺脫了函數式中數據雜亂無章的場景,使得程序的功能整齊且清晰,而且經過設計類的繼承關係讓代碼得以重用,進一步提升開發效率。以後出現的多種設計模式使得程序設計更加便捷方便。api

然而世界是複雜的,儘管OOP已經可以解決大部分的問題,仍是存在一些非強業務相關的通用功能,明明你們都須要,一旦要歸類卻發現很複雜,每每最後寫出來一個工具類。這些功能就如同城市中的水電交通通常,滲透到家家戶戶中,卻不能交由每家每戶本身來維護。這些功能就像城市的一個個切面,須要一個統籌管理的方式。這個就是AOP造成的緣由。服務器

而什麼叫橫切關注點?先解釋下關注點,就是對軟件工程有意義的小的,可管理的可描述的軟件組成部分。太拗口了對不對,個人理解就是一個操做一個方法都是對一個關注點的實現,好比插入訂單,扣減庫存,記錄日誌等等。而有些關注點是軟件的核心功能,稱爲主關注點,好比插入訂單,有些關注點則彌散在軟件內部,好比記錄日誌,這些關注點同許多不一樣的主關注點都有交集,稱爲橫切關注點。主關注點大都經過OOP的方式去設計更加清晰,而從主關注點中分離出橫切關注點則就是面向切面的程序設計的核心概念。架構

分離關注點使得解決特定領域問題的代碼從業務邏輯中獨立出來,業務邏輯的代碼中再也不含有針對特定領域問題代碼的調用,業務邏輯同特定領域問題的關係經過切面來封裝、維護,這樣本來分散在整個應用程序中的變更就能夠很好的管理起來。框架

維基百科中對面向切面編程的操做方式給了很專業的解說。而當前已經出現了AOP的特定實現或AOP相關技術,好比模塊化

  • AspectJ:源代碼和字節碼級別的編織器,需用使用Aspect語言
  • AspectWerkz:AOP框架,使用字節碼動態編織器和XML配置
  • JBoss-AOP:基於攔截器和元數據的AOP框架,運行在JBoss應用服務器上
  • BCEL(Byte-Code Engineering Library):Java字節碼操做類庫
  • Javassist:Java字節碼操做類庫

同時有一個AOP聯盟對AOP作了一個抽象和規範,造成了一個三層的表明性架構,以及一個通用的AOP API,這個API就是常用的aopalliance-api-1.0.jar。它定義了AOP的幾個通用接口:函數

  • 鏈接點(Join Point):程序執行過程當中的某個點,如方法的調用或異常的處理
  • 加強(Advice):對特定鏈接點的動做的擴展或改變
  • 攔截器(Inteceptor):繼承了Advice接口,加強(Advice)模型的封裝,通常圍繞鏈接點造成攔截器鏈
  • 調用(Invocation):繼承了JoinPoint接口,指圍繞鏈接點的攔截器觸發的調用

而對於加強(Advice),一般又分爲如下幾種類型工具

  1. 前置加強(Before advice):在鏈接點以前執行,它不能阻止流程繼續執行(除非拋出異常)
  2. 後置加強(After returning advice):鏈接點正常完成後將被執行
  3. 最終加強(After finally advice):不管鏈接點是否正常執行完成,最後都將被執行(至關於finally語句)
  4. 拋出加強(After throwing advice):當方法拋出一個異常時將被執行
  5. 環繞加強(Around advice):最強大的加強方式,圍繞鏈接點的加強。它能夠在方法執行先後觸發自定義行爲,甚至能夠選擇是否執行原方法以及經過定義本身的返回值或拋出異常來提早結束方法執行。

2.Spring AOP

在AOP框架的實現上,在Spring以前已經已有不少,但Spring作出了一些獨特的創新。

  1. 徹底由java實現,無須特殊的編譯過程。不管是AspectJ仍是JBoss-AOP,都須要特定的編譯器。對於追求便捷的開發者來講,無疑並非最優的。
  2. 集成IOC容器,從而解決企業應用上的通用問題。這點上,Spring並非最完善的AOP框架,可是其自身的AOP實現以及同AspectJ的集成,已經能覆蓋從簡單到複雜的絕大部分使用場景,而註解的使用更是大大簡化了AOP的配置。

而Spring AOP在實現過程當中,對Aop聯盟定義的API進行了擴展和加強。

  • 加強(Advice):沿用AOP聯盟的接口
  • 切點(Pointcut):至關於鏈接點(Join Point),增長了getClassFilter和getMethodMatcher兩個接口方法,用於對不一樣Advice的所做用的橫切關注點的過濾和匹配。
  • 切面(Advisor):結合加強與切點,造成切面。

而對於AOP的具體實現,Spring AOP默認使用JDK的動態代理來代理接口。而對於沒有實現接口的類,或非接口中的方法,則經過CGLIB來實現代理。經過Advisor封裝Advice和Pointcut並初始化成攔截器鏈,當方法調用請求時,匹配其所圍繞的全部Advisor,而後按順序執行,從而達到面向切面編程的核心,分離出橫切關注點進行統一配置與管理。具體的實現方式將在以後的章節裏詳細介紹。

相關文章
相關標籤/搜索