1. 程式人生 > 資訊 >高通 CEO 安蒙:明年將為 40~50% 的三星 Galaxy S 系列出貨驍龍晶片

高通 CEO 安蒙:明年將為 40~50% 的三星 Galaxy S 系列出貨驍龍晶片

AOP

面向切面程式設計,也可稱為面向方面程式設計,是一種程式設計規範,提供從另一個角度來考慮程式結構從而完善面向物件程式設計(oop)

在進行oop開發時,都是基於對元件進行開發,然後對元件進行組合,oop最大問題就是無法解耦元件進行開發

AOP為開發者提供一種進行橫切關注點,分離並織入的機制,把關橫切關注點分離,然後織入到系統中,從而無耦合的完成了我們的功能

AOP能幹什麼:

  1. 用於橫切關注點的分離和織入橫切關注點到系統
  2. 完善oop
  3. 降低元件和模組之間的耦合性
  4. 使系統容易擴充套件
  5. 而且由於關注點分離從而可以獲得元件的更好複用

關注點和織入

關注點可以分為核心關注點和橫切關注點,核心關注點即一些主要業務流程,比如支付,橫切關注點相當於一些服務,比如日誌輸出。

  1. 關注點

    可以認為是任何東西,比如日誌元件

  2. 關注點分離

    將問題細化從而單獨部分,既可以理解為不可再分割的元件。

  3. 橫切關注點

    一個元件無法完成需要的功能,需要其他元件協助完成,如日誌元件,橫切於支付元件。

    橫切關注點可能包含很多,比如非業務的:日誌,事務處理,快取,效能統計,許可權控制等等這些非業務的基礎功能,還可能是業務,如某個業務元件橫切於多個模組

  4. 織入

    橫切關注點分離後,需要通過某種技術將橫切關注點融合到系統中從而完成需要的功能,因此需要織入,織入可能在編譯期,載入期,執行期等進行。

AOP的基礎概念

  1. 連線點(Joinpoint)

    表示需要在程式中插入橫切關注點的擴充套件點,Spring只支援方法執行連線點,在AOP中表示“在哪裡幹”。

  2. 切入點(Pointcut)

    選擇一組相關連線點的模式,即可以認為連線點的集合,Spring支援perl5正則表示式和Aspect切入點模式,Spring預設使用Aspect語法,在AOP中表示“在哪裡乾的集合”

  3. 通知(Advice)

    在連線點上執行的行為,通知提供了在AOP中需要在切入點所選擇的連線點處進行擴充套件現有行為的手段,包括前置通知(before advice),後置通知(after advice),環繞通知(around advice),在AOP中表示為“幹什麼”

  4. 方面/切面(Aspect)

    橫切關注點的模組化,在AOP中表示為“在哪乾和幹什麼集合”

    切面=切入點+通知

  5. 目標物件(Target Object)

    需要被織入橫切關注點的物件,在AOP中表示為“對誰幹”

  6. 織入(Weaving)

    織入是一個過程,是將切面應用到目標物件從而創建出AOP代理物件的過程,織入可以在編譯期,類裝載期,執行期進行。

    1. AOP代理(AOP Proxy)

      AOP框架使用代理模式建立的物件,從而實現在連線點處插入通知(即應用切面),就是通過代理來對目標物件應用切面。在Spring中,AOP代理可以用JDK動態代理或CGLIB代理實現,而通過攔截器模型應用到切面。

  7. Advice分類
    前置通知(Before Advice):在切入點選擇的連線點處的方法之前執行的通知
    後置通知(After Advice): 在切入點選擇的連線點處的方法之後執行的通知
    環繞通知(Around Advices):環繞著在切入點選擇的連線點處的方法所執行的通知

  8. execution表示式

    execution表示式是切入點(PointCut)中使用的一種模式,比如

    execution(* com.sample.service.impl..*.*(..))
    

    第一個號:表示返回型別,號表示所有的型別。
    包名:表示需要攔截的包名,後面的兩個句點表示當前包和當前包的所有子包,com.sample.service.impl包、子孫包下所有類的方法。
    第二個號:表示類名,號表示所有的類。
    (..):最後這個星號表示方法名,號表示所有的方法,後面括弧裡面表示方法的引數,兩個句點表示任何引數。

    示例:

    定義業務類

​ 定義切面

​ 配置


測試

@Aspect

Spring除了支援Schema方式配置AOP,還支援註解方式:使用@AspectJ風格的切面宣告
啟用對@Aspect的支援宣告切面,@Aspect宣告切入點org.aspectj.lang.annotation包下的,@Pointcut(value=“execution表示式”)。

宣告通知
org.aspectj.lang.annotation 包下的
@Before(value = "切入點表示式或命名切入點")
@After(value = "切入點表示式或命名切入點")
@Around(value = "切入點表示式或命名切入點")

示例:

定義業務類

定義切面

配置

測試