Spring AOP

AOP是什麼?

AOP這詞聽起來耳熟,然而能清晰把它說清楚應該是少數。學習它,從歷史的進程中看看AOP是什麼時候爲什麼出現,這樣認識會比較立體。git

名稱 含義 應用
POP Process oriented programming C
OOP Object oriented programming) Java
COP Component oriented programming ReactiveJS
AOP Aspect oriented programming AspectJ,Spring
SOP service oriented programming Microservices

從C開始,你們是面向過程編程,高級語言Java出現,提出OOP的編程法則,OOP在複用的不足催生了AOP。與此同時JS風靡,ReactiveJS提倡的面向組件封裝COP思想被普遍接受。後端業務的高度複雜化帶來的解耦和自治訴求也使SOP愈來愈流行。github

因此和OOP同樣,AOP也是一種編程範式,經過添加切面點,在不改動已有核心邏輯代碼的前提下,添加功能或更改代碼流程。spring

提出

Xerox PARC的Gregor Kiczales及其同事提出了AOP概念和相關術語,並以此開發了AspectJ 和AspectWerkz。企業級應用Jboss 4.0 就是徹底採用 AOP 的思想來設計的 EJB 容器,它經過了 J2EE 的認證,在工業化應用中被證實表現優秀。Spring 2.0後使用了與AspectJ同樣的註解,但沒有使用 AspectJ 的編譯器,底層是Java庫標準的動態代理技術的實現,因此不須要額外依賴一個 AspectJ 的編譯器。編程

術語

  • Cross-cutting concerns:跨領域的問題

儘管OO模型中的大多數類都執行單個特定功能,但它們一般與其餘類共享共同的次要要求。例如,咱們可能但願在線程進入或退出方法時向數據訪問層中的類添加日誌記錄,也能夠向UI層中的類添加日誌記錄。還有些可能與安全性有關,例如訪問控制信息流控制。儘管每一個類具備很是不一樣的主要功能,但執行輔助功能所需的代碼一般是相同的。後端

  • Advice:通知建議

這是你要應用於現有模型的附加代碼。好比在線程進入或退出方法時應用的日誌記錄代碼。安全

  • Pointcut:切入點

這是應用程序中執行點的術語,須要應用交叉關注點。好比,當線程進入方法時達到切入點,而且當線程退出方法時達到另外一個切入點。工具

  • Aspect:切面

切入點和建議的組合被稱爲方面。咱們經過定義切入點並提供正確的建議,爲應用程序添加日誌記錄方面。性能

AOP用來作什麼?

如上面所提到的,咱們能夠將日誌記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來,經過對這些行爲的分離,咱們但願能夠將它們獨立到非業務邏輯的方法中,進而在這些行爲改變的時候不影響業務邏輯的代碼。學習

從場景來講Android,iOS,Java Spring都用AOP的專業應用場景。它不是必須,但這些場景用AOP給系統帶來的好處是顯然易見的。咱們學習AOP在Java Spring裏的應用,喝水不忘挖井人,那咱們先了解下AspectJ。線程

AspectJ

AspectJ的動機是發現那些使用OOP沒法很好處理的問題。好比安全性是貫穿於系統全部模塊間的問題,每一個模塊都須要應用安全機制才能保證整個系統的安全性,這裏的安全策略的實施其實就是一個橫切關注點,使用傳統的編程解決此問題很是麻煩並且容易產生差錯,這就正是AOP發揮做用的時候了。

傳統的面向對象編程中,每一個單元就是一個類,而相似於安全性這方面的問題,它們一般不能集中在一個類中處理由於它們橫跨多個類,這就致使了代碼沒法複用,從而產生了大量代碼冗餘。

面向切面編程的出現正好能處理這種場景,AspectJ應運而生,並定義了AOP,它向Java中加入了鏈接點(Join Point)和少量新結構:切點(pointcut)、通知(Advice)、類型間聲明(Inter-type declaration)和切面(Aspect)。切點和通知動態地影響程序流程,類型間聲明則是靜態的影響程序的類等級結構,而切面則是對全部這些新結構的封裝。

Spring AOP

Spring AOP 與AspectJ 的初衷一致,都是爲了統一處理橫切業務,但與AspectJ不一樣的是,Spring AOP 並不提供完整的AOP功能(即便它徹底能夠實現),Spring AOP 更注重的是與Spring IOC容器的結合,並結合該優點來解決橫切業務的問題。

同時,Spring注意到AspectJ在AOP的實現方式上依賴於特殊編譯器(ajc編譯器),處於應用成本考慮,Spring選擇規避這點,採用動態代理技術的實現原理來構建Spring AOP的內部機制(動態織入),這與AspectJ(靜態織入)有根本的區別。在AspectJ 1.5後提出@Aspect形式的註解風格。Spring也很是快地跟進了這種方式,因此Spring 2.0後便使用了與AspectJ同樣的註解,下降開發人員的理解成本。

通配符

  • .. :匹配方法定義中的任意數量的參數,此外還匹配類定義中的任意數量包

  • + :匹配給定類的任意子類

  • * :匹配任意數量的字符

實現原理

上面提到Spring的AOP是經過動態代理技術實現的,具體來講若是一個有實現接口那就經過JDK內置的工具類反射生成代理類,若是沒有實現接口那須要依賴一個CGLIB動態庫,經過繼承來動態生成一個代理類。

v2-e777957e808c92fefcbcbec3945a2f91_hd

Demo

思考問題

1,私有方法可否被切?

2,spring aop實現原理?

3,爲何要有兩種實現?

參考

Aspect oriented programming

關於 Spring AOP

(完)

@子路宇, 本文版權屬於再惠研發團隊,歡迎轉載,轉載請保留出處。

相關文章
相關標籤/搜索