承接IoC講解,本文深入Spring另一核心——AOP(Aspect Oriented Programming)面向切面編程。
OOP強調繼承、封裝、多態、抽象,以類層級關係實現復用。但面對「橫切關注點」無能為力。
案例:馬戲團小狗run()、jump()前需「馴獸師發命令」,後需「給予獎勵」。傳統OOP導致重複代碼:
public class Dog {
public void run() {
System.out.println("馴獸師發出命令!");
System.out.println("小狗開始跑!");
System.out.println("馴獸師給與獎勵");
}
public void jump() { ... 同樣重複命令與獎勵邏輯 ... }
}
日誌記錄、效能統計、安全控制、事務處理、異常處理等皆屬此類——無法以繼承/多態乾淨分離。

AOP透過預編譯與運行期動態代理,在不修改源碼前提下動態統一添加功能。
Animal介面,Dog僅保留核心業務run()、jump()。InvocationHandler:command()(前置)、award()(後置)封裝橫切邏輯。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
}
}

| 維度 | OOP | AOP |
|---|---|---|
| 關注對象 | 業務實體(Dog、Cat、Duck)及屬性行為 | 處理過程中的切面步驟/階段(command、award) |
| 目標 | 清晰高效的邏輯單元劃分 | 邏輯過程各部分低耦合隔離 |
| 核心機制 | 繼承、封裝、多態 | 動態代理、切面織入 |
兩者設計思想目標本質不同,互補而非替代。Spring中AOP具體應用將於後續實例講解。