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

Spring AOP @AspectJ 增強織入順序深度解析

     編輯:Java 綜合教學

Spring AOP @AspectJ 增強織入順序深度解析

當多個切面織入同一連接點時,增強執行順序直接影響業務邏輯正確性。本文通過完整實例,系統闡述 Spring 織入順序規則:優先級、增強類型、聲明順序三大維度的綜合判定邏輯。

核心規則總結

  1. 優先級高者先織入:實現 Ordered 接口或標註 @Order,order 值越小優先級越高;
  2. 同優先級按 IOC 容器注冊順序:XML 中 <bean> 聲明先後;
  3. 同一切面內增強類型順序:
    • 環繞前半部(proceed() 前)
    • 前置增強(@Before)
    • 目標方法執行
    • 環繞後半部(proceed() 後)
    • 最終增強(@After)
    • 後置增強(@AfterReturning/@AfterThrowing)
  4. 無序切面優先級低於有序切面:未實現 Ordered 的切面統一排在有序切面之後;
  5. @Order 與 Ordered 並存時:優先級相同則回退到 IOC 注冊順序。

實戰驗證代碼結構

// 目標對象
public class UserController {
    public void login(String name) { System.out.println("I'm " + name + " ,I'm logining"); }
}

// 有序切面 1 (order=1)
@Aspect @Order(1) class AnnotationAspect1 implements Ordered { ... }

// 有序切面 2 (order=2)
@Aspect @Order(2) class AnnotationAspect2 implements Ordered { ... }

// 無序切面
@Aspect class NoOrderAspect1 { ... }
@Aspect class NoOrderAspect2 { ... }

// XML 配置順序
<bean class="NoOrderAspect1"/>
<bean class="NoOrderAspect2"/>
<bean class="AnnotationAspect2"/>
<bean class="AnnotationAspect1"/>
<bean id="userController" class="UserController"/>

控制台輸出關鍵片段

AnnotationAspect1 實施around前,優先級為1
AnnotationAspect1 實施@before,優先級為1
AnnotationAspect2 實施around前,優先級為2
AnnotationAspect2 實施@before,優先級為2
NoOrderAspect1 實施around前,無優先級
NoOrderAspect1 實施@before,無優先級
NoOrderAspect2 實施around前,無優先級
NoOrderAspect2 實施@before,無優先級
I'm zenghao ,I'm logining
... (返程階段按相反順序執行) ...

最佳實踐建議

  • 關鍵業務切面顯式指定 @Order,避免隱式順序導致維護困難;
  • 同一切面內避免多種增強類型混用,降低認知負擔;
  • 使用 @Order 注解優於實現 Ordered 接口,代碼更簡潔;
  • 單元測試驗證織入順序,納入 CI 流程。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved