Spring也能支持多个切面。当有多个切面时,它不会存在任何顺序,这些顺序代码会随机生成,但是有时候我们希望它按照指定的顺序运行。

在此之前要先定义一个切点方法,为此新建一个接口——MultiBean

代码清单:定义多个切面的切点方法

packagecom.ssm.chapter11.multi.bean;public interfaceMultiBean {public voidtestMulti();

}

代码清单:实现MultiBean接口

packagecom.ssm.chapter11.multi.bean.impl;importcom.ssm.chapter11.multi.bean.MultiBean;importorg.springframework.stereotype.Component;/****************imports****************/@Componentpublic class MultiBeanImpl implementsMultiBean {//@Override

public voidtestMulti() {

System.out.println("test multi aspects!!");

}

}

代码清单:3个切面

packagecom.ssm.chapter11.multi.aspect;import org.aspectj.lang.annotation.*;importorg.springframework.core.Ordered;importorg.springframework.core.annotation.Order;/**************** imports ****************/@Aspect//@Order(1)

public class Aspect1 implementsOrdered {//@Override

public intgetOrder() {return 1;

}

@Pointcut("execution(* com.ssm.chapter11.multi.bean.impl.MultiBeanImpl.testMulti(..))")public voidprint() {

}

@Before("print()")public voidbefore() {

System.out.println("before 1 ......");

}

@After("print()")public voidafter() {

System.out.println("after 1 ......");

}

@AfterThrowing("print()")public voidafterThrowing() {

System.out.println("afterThrowing 1 ......");

}

@AfterReturning("print()")public voidafterReturning() {

System.out.println("afterReturning 1 ......");

}

}

packagecom.ssm.chapter11.multi.aspect;import org.aspectj.lang.annotation.*;importorg.springframework.core.annotation.Order;/**************** imports ****************/@Aspect

@Order(2)public classAspect2 {

@Pointcut("execution(* com.ssm.chapter11.multi.bean.impl.MultiBeanImpl.testMulti(..))")public voidprint() {

}

@Before("print()")public voidbefore() {

System.out.println("before 2 ......");

}

@After("print()")public voidafter() {

System.out.println("after 2 ......");

}

@AfterThrowing("print()")public voidafterThrowing() {

System.out.println("afterThrowing 2 ......");

}

@AfterReturning("print()")public voidafterReturning() {

System.out.println("afterReturning 2 ......");

}

}

packagecom.ssm.chapter11.multi.aspect;import org.aspectj.lang.annotation.*;importorg.springframework.core.annotation.Order;/**************** imports ****************/@Aspect

@Order(3)public classAspect3 {

@Pointcut("execution(* com.ssm.chapter11.multi.bean.impl.MultiBeanImpl.testMulti(..))")public voidprint() {

}

@Before("print()")public voidbefore() {

System.out.println("before 3 ......");

}

@After("print()")public voidafter() {

System.out.println("after 3 ......");

}

@AfterThrowing("print()")public voidafterThrowing() {

System.out.println("afterThrowing 3 ......");

}

@AfterReturning("print()")public voidafterReturning() {

System.out.println("afterReturning 3 ......");

}

}

代码清单:多切面测试Java配置

packagecom.ssm.chapter11.multi.config;importcom.ssm.chapter11.multi.aspect.Aspect1;importcom.ssm.chapter11.multi.aspect.Aspect2;importcom.ssm.chapter11.multi.aspect.Aspect3;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.EnableAspectJAutoProxy;/****************imports****************/@Configuration

@EnableAspectJAutoProxy

@ComponentScan("com.ssm.chapter11.multi")public classMultiConfig {

@BeanpublicAspect1 getAspect1() {return newAspect1();

}

@BeanpublicAspect2 getAspect2() {return newAspect2();

}

@BeanpublicAspect3 getAspect3() {return newAspect3();

}

}

代码清单:测试

public static voidmain(String[] args) {

ApplicationContext ctx= new AnnotationConfigApplicationContext(MultiConfig.class);

MultiBean multiBeanService= ctx.getBean(MultiBean.class);

multiBeanService.testMulti();

}

如何让它有序执行:

1.@Order(1),@Order(2),@Order(3) 注解

2.实现 implements Ordered

3.

java 切面顺序_spring 多个切面如何有序执行相关推荐

  1. Java切面理解_Spring AOP面向切面编程:理解篇

    package com.vx.servicehi.annotation; import java.lang.annotation.Annotation; import java.lang.reflec ...

  2. Java绝地求生—Spring AOP面向切面编程

    Java绝地求生-Spring AOP面向切面编程 背景 动态代理 构建被代理对象 自动生成代理 调用动态代理 Spring方法 方式一:使用Spring的API接口 方式二:使用自定义类 方式三:使 ...

  3. 什么是 Java 中的 AOP(面向切面编程)?如何使用它来实现横切关注点?

    AOP(Aspect-oriented programming,面向切面编程),是一种编程思想和技术,旨在将横切关注点和主业务逻辑分离,使得系统更容易扩展和维护.在 Java 中,AOP 主要通过代理 ...

  4. springboot异步和切面_spring中的切面和异步执行

    1.首先理解异步和多线程的概念,怎么实现接口的异步调用呢?多线程,这是很多人第一眼想到的关键词,没错,多线程就是一种实现异步调用的方式! 2.下面介绍怎么实现异步调用方式 3.首先如果你的项目是spr ...

  5. Java 初始化顺序

    无继承关系的初始化顺序 class Sample {Sample(String s){System.out.println(s);}Sample(){System.out.println(" ...

  6. java 继承类 变量、静态变量、构造函数执行顺序

    java 继承类 变量.静态变量.构造函数执行顺序 Java代码   class C{ static int prt(int i){ System.out.println(i); return i; ...

  7. java实现顺序栈_Java实现顺序栈原理解析

    这篇文章主要介绍了java实现顺序栈原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 什么是栈 1.栈的英文是stack 2.栈是一个先入后出 ...

  8. java io顺序_Java顺序IO性能

    java io顺序 许多应用程序将一系列事件记录到基于文件的存储中,以供以后使用. 从日志记录和审核,直到在事件源设计或其紧密相关的CQRS中保留事务重做日志,这都可以是任何东西. Java具有多种方 ...

  9. java foreach顺序_Java中的LongStream forEachOrdered()方法

    forEachOrdered()Java中的方法对此流的每个元素执行一个操作,以确保对具有定义的遇到顺序的流按遇到顺序处理每个元素. 语法如下-void forEachOrdered(LongCons ...

最新文章

  1. HDU 2094 产生冠军
  2. 笔记-项目范围管理-项目范围管理计划和需求管理计划
  3. es if语法 script_熬夜7天,我总结了JavaScript与ES的25个重要知识点!
  4. 使用 dotnet-monitor 分析.NET 应用程序
  5. ant vue 语言_Ant Design Vue是什么
  6. 老外写的关于协程的性能文章-主打http协议
  7. 使用Jenkins搭建持续集成环境的方法(二)
  8. 比long 大的数用__int64 输出符%I64d
  9. Motorola WLAN之无线漫游
  10. docker学习--数据卷
  11. 极光推送的简单实现方法
  12. java中ajax是什么意思,java中使用Ajax技术
  13. STL源码剖析(四):容器(6)Rb_tree
  14. 用于信号处理的Xilinx FPGA XC7K325T PCIeX8 FMC处理板卡
  15. 电脑如何设置开机密码?详细教程来了
  16. Google benchmark使用手册及范例
  17. 数据告诉你哪里才是中国最热的火炉城市?
  18. 精准发力补短板,产教融合发展论坛为“稳就业”赋能!
  19. ts 的class和interface的区别
  20. 2022年第三届“大湾区杯”粤港澳金融数学数学建模竞赛

热门文章

  1. 高数:微分 函数图像 曲率
  2. nginx ats squid varnish使用场景对比介绍
  3. 在ubuntu中使用jupyter
  4. 华扬联众与海南旅投签订战略合作协议,共建一流免税概念社区
  5. 网易云信 7 周年丨服务超过 150 万开发者,消息量突破 20000 亿条
  6. Freemarker模板判断比较
  7. java结合prometheus实现自定义数据监控
  8. 谷歌封杀猎豹移动等600个APP,开发者如何绝处逢生?
  9. 软件构造Chapter6 Review
  10. 看会、参会、相亲、购物、领奖,1024 程序员节带你嗨玩!