当前位置: 首页 > news >正文

Spring Boot中对同一接口定义多个切面的示例,分别通过接口方式和注解方式实现切面排序,并对比差异

以下是Spring Boot中对同一接口定义多个切面的示例,分别通过接口方式注解方式实现切面排序,并对比差异:


一、接口方式实现切面排序

1. 定义接口
// 服务接口
public interface MyService {
    void methodA();
    void methodB();
}

// 接口实现类
@Service
class MyServiceImpl implements MyService {
    @Override
    public void methodA() {
        System.out.println("Executing methodA");
    }

    @Override
    public void methodB() {
        System.out.println("Executing methodB");
    }
}
2. 定义切面(实现 Ordered 接口)
// 切面A:优先级高(Order=1)
@Component
@Aspect
public class AspectA implements Ordered {
    @Override
    public int getOrder() {
        return 1; // 数值越小,优先级越高
    }

    @Before("execution(* com.example..MyService.*(..))")
    public void beforeA() {
        System.out.println("AspectA before advice");
    }
}

// 切面B:优先级低(Order=2)
@Component
@Aspect
public class AspectB implements Ordered {
    @Override
    public int getOrder() {
        return 2;
    }

    @Before("execution(* com.example..MyService.*(..))")
    public void beforeB() {
        System.out.println("AspectB before advice");
    }
}
3. 测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestAspect {
    @Autowired
    private MyService myService;

    @Test
    public void testOrder() {
        myService.methodA();
        // 输出顺序:AspectA before -> AspectB before -> methodA
    }
}

二、注解方式实现切面排序

1. 定义切面(使用 @Order 注解)
// 切面C:优先级高(Order=1)
@Component
@Aspect
@Order(1)
public class AspectC {
    @Before("execution(* com.example..MyService.*(..))")
    public void beforeC() {
        System.out.println("AspectC before advice");
    }
}

// 切面D:优先级低(Order=2)
@Component
@Aspect
@Order(2)
public class AspectD {
    @Before("execution(* com.example..MyService.*(..))")
    public void beforeD() {
        System.out.println("AspectD before advice");
    }
}
2. 测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestAspect {
    @Autowired
    private MyService myService;

    @Test
    public void testAnnotationOrder() {
        myService.methodB();
        // 输出顺序:AspectC before -> AspectD before -> methodB
    }
}

三、两种方式的对比表格

特性接口方式(Ordered注解方式(@Order
实现方式实现 Ordered 接口,重写 getOrder() 方法在切面类上添加 @Order(int value) 注解
优先级规则数值越小,优先级越高数值越小,优先级越高
适用场景传统方式,需继承接口推荐方式,更简洁
局限性需要额外实现接口无额外继承要求
Spring 内部处理通过 OrderComparator 比较直接解析 @Order 注解

四、关键点总结

  1. 切面执行顺序

    • 两者均通过数值控制优先级,Order=1 的切面比 Order=2 的切面先执行
    • 若未指定顺序,Spring 默认按声明顺序加载,但结果不可靠,建议显式设置。
  2. 推荐实践

    • 优先使用注解方式@Order),代码更简洁且符合 Spring 的注解驱动风格。
    • 若需复用排序逻辑,可结合 Ordered 接口实现通用排序策略。

相关文章:

  • 基于方法分类的无监督图像去雾论文
  • 小白入门机器学习概述
  • 128. 最长连续序列
  • 树莓派超全系列文档--(18)树莓派配置音频
  • 快速入手:基于SpringBoot的Dubbo应用融合Nacos成为注册中心
  • 工业机器人核心算法体系解析:从感知到决策的技术演进
  • Ubuntu 系统 Docker 中搭建 CUDA cuDNN 开发环境
  • 鸿蒙应用元服务开发-Account Kit概述
  • Raspberry 树莓派 CM4模块的底板设计注意事项
  • 运维简历之项目经验(Project Experience in Pperation and Maintenance Resume)
  • InfiniBand (IB)和 以太网 的区别
  • 《孟婆汤的零知识证明加密术》
  • 发动机试验台底座:汽车研发的关键支撑(北重制造厂家)
  • 记忆学习用内容
  • Dify 配置语音转文字
  • [skip]CBAM
  • 蓝桥杯比赛python程序设计——纯职业小组
  • 时间处理核心原理与Easy-ES实战避坑指南
  • Element组件如何按需导入
  • Python----机器学习(KNN:使用数学方法实现KNN)
  • 加强公司内部网站建设/推广普通话的重要意义
  • 怎样做网站的优化/泉州百度推广咨询
  • 夜夜做新郎网站/简述seo的基本步骤
  • 黄江镇网站建设/杭州网站设计制作
  • 有做分期海淘的网站吗/网络营销的新特点
  • 长沙网站收录/百度网盘登陆