AOP中的專業術語介紹

一、AOP簡介

AOP(Aspect-Oriented Programming, 面向切面編程): 是一種新的方法論, 是對傳統 OOP(Object-Oriented Programming, 面向對象編程) 的補充。

AOP 的主要編程對象是切面(aspect), 而切面是把橫切關注點模塊化!

在應用 AOP 編程時, 需要定義公共功能, 但可以明確的定義這個功能在哪裏應用, 並且不必修改需要使用公共功能的類。 這樣以來橫切關注點就被模塊化到特殊的對象(切面)裏.

二、AOP 的好處

每個事物邏輯位於一個位置, 代碼不分散, 便於維護和升級

業務模塊更簡潔, 只包含核心業務代碼。

三、AOP 術語

1. 連接點(Joinpoint)

連接點描述的是程序執行的某個特定位置。如一個類的初始化前、初始化後,或者類的某個方法調用前、調用後、方法拋出異常後等等。一個類或一段程序代碼擁有一些具有邊界性質的特定點,這些特定點就稱爲連接點。連接點用來定義在目標程序的哪裏通過AOP加入新的邏輯。

Spring僅支持方法的連接點,即僅能在方法調用前、方法調用後、方法拋出異常時以及方法調用前後這些程序執行點織入增強。

連接點由兩個信息確定:第一是用方法表示的程序執行點;第二是用相對點表示的方位

執行點:即程序執行流程中的某個點。如執行某個語句或者語句塊、執行某個方法、裝載某個類、拋出某個異常……

例如 :UserService#add() 方法執行之前,這個連接點。執行點爲 UserService#add()方法本身; 方位爲該方法執行前的位置。

2. 切入點(Pointcut)

切入點是一個連接點的過濾條件,AOP 通過切點定位到特定的連接點。每個類都擁有多個連接點:例如 UserService類中的所有方法實際上都是連接點,即連接點是程序類中客觀存在的事物。類比:連接點相當於數據庫中的記錄,切點相當於查詢條件。切點和連接點不是一對一的關係,一個切點匹配多個連接點,切點通過 org.springframework.aop.Pointcut 接口進行描述,它使用類和方法作爲連接點的查詢條件。
xml配置方式:

    <aop:config>
        <aop:pointcut id="myPointcut" expression="execution(* com.kaka.spring.aop.aspect.service.UserService.*(..))"/>
    </aop:config>
3. 通知(Advice)

切面在某個具體的連接點採取的行爲或行動,稱爲通知切面的核心邏輯代碼都寫在通知中,有人也稱之爲增強或者橫切關注點。通知是切面功能的具體實現,通常是業務代碼以外的需求,如日誌、驗證等,這些被模塊化的特殊對象。
常用的通知接口有

  • 前置通知:org.springframework.aop.MethodBeforeAdvice
  • 後置通知:org.springframework.aop.AfterReturningAdvice
  • 異常通知:org.springframework.aop.ThrowsAdvice
    該接口沒有要實現的方法,需要自定義一個afterThrowing()方法。
  • 環繞通知:org.aopalliance.intercept.MethodInterceptor

xml配置方式

    <bean id="myMethodBeforeAdvice" class="com.kaka.spring.aop.advice.MyMethodBeforeAdvice"/>
    <aop:config>
        <!--①. 切入點(可以有多個) -->
        <aop:pointcut id="myPointcut" expression="execution(* com.kaka.spring.aop.aspect.service.UserService.*(..))"/>
        <!-- ②.各種通知(可以有多個,並且可以加在不同的切入點上) -->
        <aop:advisor advice-ref="myMethodBeforeAdvice" pointcut-ref="myPointcut" />
    </aop:config>

MyMethodBeforeAdvice這個類,實現了MethodBeforeAdvice前置通知接口。

4. 通知器(Advisor)

通知器由一個切入點(pointcut)和一個通知(Advice)組成。通知就是增強的那部分功能代碼,如記錄日誌代碼、控制權限代碼。

<aop:advisor advice-ref="myMethodBeforeAdvice" pointcut-ref="myPointcut" />
5. 切面(Aspect)

與通知器(advisor)類似都是通知+切入點。區別在於,切面中的類無需實現通知接口,但需要在配置文件中指定類中的方法名;而通知器僅需指定類名即可,因爲通知器中的類都實現了通知接口,很明確的知道通知方法是哪個。
xml配置方式

    <bean id="myXmlAspect" class="com.kaka.spring.aop.aspect.MyXmlAspect"/>
    <aop:config>
        <!--①. 切入點(可以有多個) -->
        <aop:pointcut id="myPointcut" expression="execution(* com.kaka.spring.aop.aspect.service.UserService.*(..))"/>
        <!--②. 切面(可以有多個) -->
        <aop:aspect ref="myXmlAspect">
            <!--切點與切面中的方法關聯 -->
            <aop:around method="aroundMethod" pointcut-ref="myPointcut"/>
        </aop:aspect>
    </aop:config>

MyXmlAspect類無需實現任何通知接口,只需定義一個aroundMethod方法即可,該方法名也可以自定義其他的。
可以理解爲:切面就是自定定義的aop對象,通知就是配置中指定的該對象方法。

6. 目標(Target)

被通知的對象(方法)

7. 代理(Proxy)

向目標對象應用通知之後創建的對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章