首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring學習筆記(三):AOP面向切面編程核心原理與動態代理實戰

     編輯:Java 相關知識

承接IoC講解,本文深入Spring另一核心——AOP(Aspect Oriented Programming)面向切面編程。

OOP回顧與缺陷:橫切關注點難題

OOP強調繼承、封裝、多態、抽象,以類層級關係實現復用。但面對「橫切關注點」無能為力。

案例:馬戲團小狗run()、jump()前需「馴獸師發命令」,後需「給予獎勵」。傳統OOP導致重複代碼:

public class Dog {
    public void run() {
        System.out.println("馴獸師發出命令!");
        System.out.println("小狗開始跑!");
        System.out.println("馴獸師給與獎勵");
    }
    public void jump() { ... 同樣重複命令與獎勵邏輯 ... }
}

日誌記錄、效能統計、安全控制、事務處理、異常處理等皆屬此類——無法以繼承/多態乾淨分離。

AOP核心思想:切面分離橫切邏輯

AOP透過預編譯與運行期動態代理,在不修改源碼前提下動態統一添加功能。

重構步驟:提取切面邏輯

  1. 業務介面與實現:Animal介面,Dog僅保留核心業務run()、jump()。
  2. 切面類實作InvocationHandler:command()(前置)、award()(後置)封裝橫切邏輯。
  3. 動態代理創建:Proxy.newProxyInstance()生成代理物件,invoke()攔截方法調用,織入切面。
public class MyProxy implements InvocationHandler {
    private Object targetObject;
    public Object createProxyInstance(Object targetObject) {
        this.targetObject = targetObject;
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
            targetObject.getClass().getInterfaces(), this);
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        command();                    // 前置切面
        Object ret = method.invoke(targetObject, args); // 執行目標方法
        award();                      // 後置切面
        return ret;
    }
    private void command() { System.out.println("馴獸師發出命令!"); }
    private void award() { System.out.println("馴獸師給與獎勵!"); }
}

客戶端調用透明化

public class Client {
    public static void main(String[] args) {
        MyProxy handler = new MyProxy();
        Animal dog = (Animal) handler.createProxyInstance(new Dog());
        dog.run();  // 自動織入command → run → award
        dog.jump(); // 自動織入command → jump → award
    }
}

AOP與OOP本質差異

維度OOPAOP
關注對象業務實體(Dog、Cat、Duck)及屬性行為處理過程中的切面步驟/階段(command、award)
目標清晰高效的邏輯單元劃分邏輯過程各部分低耦合隔離
核心機制繼承、封裝、多態動態代理、切面織入

兩者設計思想目標本質不同,互補而非替代。Spring中AOP具體應用將於後續實例講解。

出處

博客園zs234

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved