AOP簡介

weixin_34402408發表於2018-06-11

AOP簡介

在這裡向說一件之前生活中比較常見的事情就是抄電錶,電錶在我們日常的生活中很常見,只有我們用電它就在記錄我們用的電量,一段時間後就會有人來抄電錶。在這個中電錶只記錄我們的用電量,而不用管電量的統計等。而軟體系統中的一些功能就像電錶一樣,這些功能需要用到應用程式的多個地方,但是我們又不希望在每個點都明確的呼叫她們。比如我們常用的日誌、安全和事務管理。如果我們讓應用物件關注自己的業務邏輯,其他方面的都交給其他的物件來處理,這些會顯得程式碼更加的精簡、清晰。

在軟體中這些散佈於應用中多處的功能被稱為橫切關注點(日誌、安全等)(cross-cutting concern)。通常來說,這些橫切的關注點是和應用的業務邏輯分離的(當時在很多地方是嵌入在應用的業務邏輯中,而AOP做的就是把這些關注點和業務邏輯分開,那麼AOP到底是什麼?

AOP是Aspect Oriented Programing的簡稱,被譯為“面向切面的程式設計”。按照應用程式重構的思想,如果多個類中出現了相同的程式碼,那麼就應該考慮將這些相同的程式碼抽象出來定義成一個父類或者使用委託,但是如果在整個的應用程式中都是用相同的一個或者幾個基類,往往會導致應用程式變得更加複雜。而面向切面可以替代繼承和委託,而且在很多的場合下可以使程式變得更加的簡潔。

12538114-e3877f0b511232fa.png
AOP

AOP中的一些術語

和大多數的技術一樣,AOP也有自己的一些術語。這些術語用於描述一個切面。

  1. 連線點(Joinpoint)

連線點是程式執行的某個特定的位置,如類的初始化前、類的初始化後、類的某個方法呼叫前,每個方法呼叫後、方法丟擲以上後。一個類或者一段程式程式碼擁有一些具有邊界性質的特殊點。

  1. 切點(Pointcut)

每個程式都擁有多個連線點,如一個擁有兩個方法的類,這兩個方法都是連線點,即連線點是程式類中客觀存在的事物。簡單的來說也就是連線點都是可以切入的點,每一次我們可以選擇一些特點的連線點切入,而我們所選的這些連線點就是切點。可以通過資料庫的查詢來理解切點和連線點之間的關係:連線點相當於資料庫中的記錄(也就是所有能夠連線的點),而切點相當與查詢條件。切點和連線點不是一一對應的關係,一個切點可以匹配多個連線點。

  1. 增強(Advice)

增強是織入連線點上的一段程式。向記錄日誌等,我們可以在應用程式邏輯方法完成後,去增強這個方法,也就是選擇這個類的這個方法作為切點,去織入一段程式記錄日誌。相當於動態的封裝這個方法。

  1. 目標物件

增強邏輯的織入目標類。如果沒有AOP,那麼目標業務類需要自己實現所有的邏輯。

  1. 引介(Introduction)

引介是一種特殊的增強,她為類新增一些屬性方法。這樣,及時一個業務類原本沒有實現某個介面,通過AOP的引介功能,也可以動態地為該業務類新增介面實現邏輯。

  1. 織入(Weaving)

織入是將增強新增到目標類的具體連線點上的過程。從名字上也可以看出,AOP就像織布機一樣,將目標類,增強編制在一起。根據不同的實現技術,AOP有三種織入方式。

(1)編譯期織入:切面在目標類編譯時被織入,這要求需用使用特殊的Java編譯器。

(2)類裝載期被織入:切面在目標類載入到JVM時被織入,這種方式需要特殊的類載入器(ClassLoader),它可以在目標類引入應用之前增強該目標類的位元組碼。

(3)動態代理織入,在執行期為目標類新增增強生成子類的方式。

Spring採用動態代理織入,AspectJ採用編譯器織入和類裝載期織入。

  1. 代理(Proxy)

一個類別AOP增強之後,就會產生一個新的類,他是如何了袁磊和增強邏輯的代理類。根據不同的代理方式,代理類既可以和原類具有相同介面的類,也可能就是原來的類,所以可以採用和呼叫原類相同的方式呼叫代理類。

  1. 切面(Aspect)

切面有切點和增強(引介)組成,它既包括了橫切邏輯的定義,也包括連線點的定義。

AOP的實現者

  1. AspectJ

AspectJ是一個面向切面的框架,2001年有Xerox PARC的AOP小組釋出,它擴充套件了Java語言。AspectJ定義了AOP語法,所以它有一個專門的編譯器用來生成遵守Java位元組編碼規範的Class檔案。

  1. AspectWerkz

AspectWerkz是基於Java的簡單、動態、輕量級的AOP框架,該框架釋出於2002年,有BEA Systems提供支援。它支援執行期或類裝載期織入橫切程式碼,它也有一個特殊的類裝載器。現在AspectJ和AspectWerkz專案已經合併,它們合作的第一個釋出版是AspectJ 5:擴充套件AspectJ語言,以註解的方式支援類似AspectJ的程式碼風格。

  1. Jboss AOP

JBoss AOP於2004年作為JBoss應用伺服器框架的擴充套件功能釋出。

  1. Spring AOP

Spring AOP使用純Java實現,他不需要專門的編譯過程,也不需要特殊的類裝載器,他在執行期通過代理方式向目標類中織入增強程式碼。