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

Spring AOP 核心原理與實戰:從切面術語到源碼級動態代理解析

     編輯:Java 綜合教學

為什麼需要 AOP?

業務邏輯中常夾雜日誌、安全、事務等橫切關注點。若硬編碼在業務方法中,會導致代碼臃腫、難維護、重複度高。Spring AOP 提供聲明式方式將橫切邏輯與業務邏輯分離。

AOP 核心術語

  • Advice(通知):具體執行的橫切邏輯(如記日誌)
  • Join Point(連接點):程序執行過程中可插入通知的點(如方法調用、異常拋出)
  • Pointcut(切點):匹配連接點的條件表達式(如 execution(* com.service.*.*(..)))
  • Aspect(切面):通知 + 切點的組合,定義「何時、何地、做什麼」
  • Weaving(織入):將切面應用到目標對象的過程

三種織入時機

  1. 編譯期:需特殊編譯器(AspectJ ajc)
  2. 類加載期:需特殊 ClassLoader(LTW)
  3. 運行期(Spring AOP 採用):基於動態代理,無需特殊工具

Spring AOP 兩大代理方式

  • JDK 動態代理:目標類實現接口時使用,生成實現同接口的代理類
  • CGLIB:目標類未實現接口時使用,通過繼承生成子類代理

默認策略:有接口用 JDK,否則用 CGLIB。可通過 proxy-target-class="true" 強制 CGLIB。

實戰 Demo:基於註解配置

// 1. 業務接口與實現
public interface Biz { void doBiz(); }
@Component class BizImpl implements Biz {
    public void doBiz() { System.out.println("doing biz"); }
}

// 2. 切面類
@Aspect @Component
class LoggingAspect {
    @Before("execution(* com.demo.Biz.doBiz(..))")
    public void logBefore() { System.out.println("this is a advice"); }
}

// 3. 配置啟用
@Configuration @EnableAspectJAutoProxy
class AopConfig {}

// 4. 測試
ApplicationContext ctx = new AnnotationConfigApplicationContext(AopConfig.class);
ctx.getBean(Biz.class).doBiz();
// 輸出:this is a advice → doing biz

源碼級流程追蹤(CGLIB 路徑)

  1. AbstractAutoProxyCreator 後置處理器識別需代理 Bean
  2. CglibAopProxy 創建代理對象(Enhancer 子類化)
  3. 調用代理方法進入 CglibMethodInvocation.proceed()
  4. 攔截器鏈依次執行:Advice.invoke() → invocation.proceed() → 目標方法

關鍵點:advised.getInterceptorsAndDynamicInterceptionAdvice() 根據 Pointcut 匹配構建攔截器鏈。

總結

Spring AOP 以運行期動態代理實現橫切邏輯解耦,核心在於ProxyFactory決策代理類型與MethodInterceptor鏈式調用。理解其原理有助於排查代理失效、性能調優及自定義擴展。

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