在 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;
    }
}    

代码解释

  • HighPriorityAspectLowPriorityAspect 都实现了 Ordered 接口。
  • getOrder() 方法分别返回 12,这表明 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 切面的执行顺序进行优先级控制。这两种方式都能确保在有多个切面时,按照你期望的顺序执行增强逻辑。