AOP


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包、子孫包下所有類的方法。
    第二個號:表示類名,號表示所有的類。
    (..):最后這個星號表示方法名,號表示所有的方法,后面括弧里面表示方法的參數,兩個句點表示任何參數。

    示例:

    定義業務類

image

​ 定義切面
image

​ 配置

image
image

測試

image

@Aspect

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

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

示例:

定義業務類

image

定義切面
image

配置

image

測試
image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM