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功能,我們可以使業務模塊更簡潔, 只包含核心業務代碼,而且由於切面位於單獨的類中,代碼不分散, 便於維護和升級。

這裏寫圖片描述

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 創建代理。

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