在 Spring 里,AOP(面向切面编程)允许你在不修改原有业务逻辑的基础上增强功能。有时候,你可能需要对多个切面的执行顺序进行控制,也就是实现 AOP 切面的优先级控制。Spring 提供了两种主要方式来实现这一点,下面为你详细介绍。
1. 实现 Ordered
接口
你可以让切面类实现 org.springframework.core.Ordered
接口,该接口有一个 getOrder()
方法,返回值是一个整数,数值越小,切面的优先级就越高。
示例代码
HighPriorityAspect.java
package com.example.aop;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class HighPriorityAspect implements Ordered {
@Before("execution(* com.example.service.*.*(..))")
public void beforeAdvice() {
System.out.println("高优先级切面执行前置通知");
}
@Override
public int getOrder() {
return 1;
}
}
LowPriorityAspect.java
package com.example.aop;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LowPriorityAspect implements Ordered {
@Before("execution(* com.example.service.*.*(..))")
public void beforeAdvice() {
System.out.println("低优先级切面执行前置通知");
}
@Override
public int getOrder() {
return 2;
}
}
代码解释
HighPriorityAspect
和LowPriorityAspect
都实现了Ordered
接口。getOrder()
方法分别返回1
和2
,这表明HighPriorityAspect
的优先级更高,会先执行。
2. 使用 @Order
注解
你也可以使用 org.springframework.core.annotation.Order
注解来指定切面的优先级,注解中的值同样是一个整数,数值越小,优先级越高。
示例代码
HighPriorityAspectWithAnnotation.java
package com.example.aop;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Aspect
@Component
@Order(1)
public class HighPriorityAspectWithAnnotation {
@Before("execution(* com.example.service.*.*(..))")
public void beforeAdvice() {
System.out.println("使用注解的高优先级切面执行前置通知");
}
}
LowPriorityAspectWithAnnotation.java
package com.example.aop;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Aspect
@Component
@Order(2)
public class LowPriorityAspectWithAnnotation {
@Before("execution(* com.example.service.*.*(..))")
public void beforeAdvice() {
System.out.println("使用注解的低优先级切面执行前置通知");
}
}
代码解释
@Order(1)
表明HighPriorityAspectWithAnnotation
的优先级比LowPriorityAspectWithAnnotation
(@Order(2)
)高,所以HighPriorityAspectWithAnnotation
会先执行。
总结
通过实现 Ordered
接口或者使用 @Order
注解,你可以轻松地对 Spring AOP 切面的执行顺序进行优先级控制。这两种方式都能确保在有多个切面时,按照你期望的顺序执行增强逻辑。