天天看點

spring知識五------AOP基礎

Spring的兩大核心—-DI和AOP。

AOP概念

Aspect Oriented Programming(AOP),面向切面程式設計。AOP主要實作的目的是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。比如我們最常見的就是日志記錄了。AOP 的主要程式設計對象是切面(aspect)

AOP簡介

我們假設現在有一個電腦程式,是用來計算加減乘除的,此時我們有一需求:

–日志:在程式執行期間追蹤正在發生的活動,記在方法執行進行日志列印

如果在傳統的方式,我們需要找到這加減乘除四個方法,然後分别在方法題内進行日志的列印,這樣的一種方式,代碼如下

@Override
    public int add(int i, int j) {
        System.out.println("ATGU---->The methor add begin with ["+i+","+j+"]");
        int result = i+j;
        System.out.println("ATGU---->The method add ends with "+result);
        return result;
    }

    @Override
    public int sub(int i, int j) {
        System.out.println("The methor sub begin with ["+i+","+j+"]");
        int result = i-j;
        System.out.println("The method sub ends with "+result);
        return result;
    }

    @Override
    public int mul(int i, int j) {
        System.out.println("The methor mul begin with ["+i+","+j+"]");
        int result = i*j;
        System.out.println("The method mul ends with "+result);
        return result;
    }

    @Override
    public int div(int i, int j) {
        System.out.println("The methor div begin with ["+i+","+j+"]");
        int result = i/j;
        System.out.println("The method div ends with "+result);
        return result;
    }
           

這時,我們從上面可以發現,我們重複了許多相同的日志代碼,而且代碼看起來非常混亂,甚至日志代碼都已經遠遠超過了我們的核心代碼,況且,如果在後期我們需要對日志内容進行修改,會非常麻煩,需要在每一個方法子產品體内都進行修改。這樣做真的而是費事費力。

在這種情況下,我們可以利用動态代理進行日志的列印,

代理設計模式的原理: 使用一個代理将對象包裝起來, 然後用該代理對象取代原始對象. 任何對原始對象的調用都要通過代理. 代理對象決定是否以及何時将方法調用轉到原始對象上。但是使用代理過于複雜。

在這種情況下,利用spring給我們提供的AOP功能,我們可以使業務子產品更簡潔, 隻包含核心業務代碼,而且由于切面位于單獨的類中,代碼不分散, 便于維護和更新。

spring知識五------AOP基礎

AOP術語

切面(Aspect): 橫切關注點被子產品化的特殊對象(logging切面),這樣的話,就可以将一個切面應用到多個子產品。

通知(Advice): 切面必須要完成的工作,是我們切面功能的實作,就好比上圖的日志方法的實作。

目标(Target): 被通知的對象,即那些子產品将要調用通知。

代理(Proxy): 向目标對象應用通知之後建立的對象。

連接配接點(Joinpoint):程式執行的某個特定位置:如類某個方法調用前、調用後、方法抛出異常後等。連接配接點由兩個資訊确定:方法表示的程式執行點;相對點表示的方位。例如 ArithmethicCalculator#add() 方法執行前的連接配接點,執行點為 ArithmethicCalculator#add(); 方位為該方法執行前的位置。

切點(pointcut):每個類都擁有多個連接配接點:例如 ArithmethicCalculator 的所有方法實際上都是連接配接點,即連接配接點是程式類中客觀存在的事務。AOP 通過切點定位到特定的連接配接點。類比:連接配接點相當于資料庫中的記錄,切點相當于查詢條件。切點和連接配接點不是一對一的關系,一個切點比對多個連接配接點,切點通過 org.springframework.aop.Pointcut 接口進行描述,它使用類和方法作為連接配接點的查詢條件。

AspectJ

Aspectj專門産生動态代理的一個架構,spring的aop使用了這個動态代理,他也是Java 社群裡最完整最流行的 AOP 架構。

在 Spring 中啟用 AspectJ 注解支援

1、要在 Spring 應用中使用 AspectJ 注解, 必須在 classpath 下包含 AspectJ 類庫: aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar,而且我們還要在配置檔案中增加aop命名空間。

2、要在 Spring IOC 容器中啟用 AspectJ 注解支援, 隻要在 Bean 配置檔案中定義一個空的 XML 元素 【aop:aspectj-autoproxy】,當 Spring IOC 容器偵測到 Bean 配置檔案中的 【aop:aspectj-autoproxy】元素時, 會自動為與 AspectJ 切面比對的 Bean 建立代理。