1. 程式人生 > >spring原理之AOP

spring原理之AOP

AOP:Spring利用動態代理技術實現了AOP增強功能。這個動態代理是通過Java的動態代理或CGLIB技術實現。具體根據代理物件實現的是類或者介面來決定。要理解aop就要理解jdk動態代理以及cglib動態動態代理。
AOP 中有以下基礎概念:
    Join point(連線點):程式執行期間的某一個點,例如執行方法或處理異常時候的點。在 Spring AOP 中,連線點總是表示方法的執行。
    Advice(通知):通知是指一個切面在特定的連線點要做的事情。通知分為方法執行前通知,方法執行後通知,環繞通知等。許多 AOP 框架(包括 Spring)都將通知建模為攔截器,在連線點周圍維護一系列攔截器(形成攔截器鏈),對連線點的方法進行增強。
    Pointcut(切點):一個匹配連線點(Join point)的謂詞表達式。通知(Advice)與切點表示式關聯,並在切點匹配的任何連線點(Join point)(例如,執行具有特定名稱的方法)上執行。切點是匹配連線點(Join point)的表示式的概念,是AOP的核心,並且 Spring 預設使用 AspectJ 作為切入點表示式語言。
    Aspect(切面):它是一個跨越多個類的模組化的關注點,它是通知(Advice)和切點(Pointcut)合起來的抽象,它定義了一個切點(Pointcut)用來匹配連線點(Join point),也就是需要對需要攔截的那些方法進行定義;它定義了一系列的通知(Advice)用來對攔截到的方法進行增強;
    Target object(目標物件):被一個或者多個切面(Aspect)通知的物件,也就是需要被 AOP 進行攔截對方法進行增強(使用通知)的物件,也稱為被通知的物件。由於在 AOP 裡面使用執行時代理,所以目標物件一直是被代理的物件。
    AOP proxy(AOP 代理):為了實現切面(Aspect)功能使用 AOP 框架建立一個物件,在 Spring 框架裡面一個 AOP 代理要麼指 JDK 動態代理,要麼指 CgLIB 代理。
    Weaving(織入):是將切面應用到目標物件的過程,這個過程可以是在編譯時(例如使用 AspectJ 編譯器),類載入時,執行時完成。Spring AOP 和其它純 Java AOP 框架一樣,是在執行時執行植入。
    Advisor:這個概念是從 Spring 1.2的 AOP 支援中提出的,一個 Advisor 相當於一個小型的切面,不同的是它只有一個通知(Advice),Advisor 在事務管理裡面會經常遇到,這個後面會講到。

    在 Spring 中 AOP 代理使用 JDK 動態代理和 CGLIB 代理來實現,預設如果目標物件是介面,則使用 JDK 動態代理,否則使用 CGLIB 來生成代理類.

例如spring配置:

<aop:config>
        <aop:pointcut id="loggerCutpoint"
            expression="execution(* com.how2java.service.ProductService.*(..)) "
        />     
        <aop:aspect id="logAspect" ref="loggerAspect">
            <aop:after pointcut-ref="loggerCutpoint" method="log"/>
        </aop:aspect>
</aop:config>