當多個切面織入同一連接點時,增強執行順序直接影響業務邏輯正確性。本文通過完整實例,系統闡述 Spring 織入順序規則:優先級、增強類型、聲明順序三大維度的綜合判定邏輯。
Ordered 接口或標註 @Order,order 值越小優先級越高;<bean> 聲明先後;proceed() 前)@Before)proceed() 後)@After)@AfterReturning/@AfterThrowing)Ordered 的切面統一排在有序切面之後;// 目標對象
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 接口,代碼更簡潔;