Javaweb之SpringBootWeb案例之AOP通知顺序的详细解析

3.2 通知顺序

讲解完了Spring中AOP所支持的5种通知类型之后,接下来我们再来研究通知的执行顺序。

当在项目开发当中,我们定义了多个切面类,而多个切面类中多个切入点都匹配到了同一个目标方法。此时当目标方法在运行的时候,这多个切面类当中的这些通知方法都会运行。

此时我们就有一个疑问,这多个通知方法到底哪个先运行,哪个后运行? 下面我们通过程序来验证(这里呢,我们就定义两种类型的通知进行测试,一种是前置通知@Before,一种是后置通知@After)

定义多个切面类:

@Slf4j
@Component
@Aspect
public class MyAspect2 {//前置通知@Before("execution(* com.itheima.service.*.*(..))")public void before(){log.info("MyAspect2 -> before ...");}
​//后置通知@After("execution(* com.itheima.service.*.*(..))")public void after(){log.info("MyAspect2 -> after ...");}
}
​
@Slf4j
@Component
@Aspect
public class MyAspect3 {//前置通知@Before("execution(* com.itheima.service.*.*(..))")public void before(){log.info("MyAspect3 -> before ...");}
​//后置通知@After("execution(* com.itheima.service.*.*(..))")public void after(){log.info("MyAspect3 ->  after ...");}
}
@Slf4j
@Component
@Aspect
public class MyAspect4 {//前置通知@Before("execution(* com.itheima.service.*.*(..))")public void before(){log.info("MyAspect4 -> before ...");}
​//后置通知@After("execution(* com.itheima.service.*.*(..))")public void after(){log.info("MyAspect4 -> after ...");}
}
 

重新启动SpringBoot服务,测试通知的执行顺序:

备注:

  1. 把DeptServiceImpl实现类中模拟异常的代码删除或注释掉。

  2. 注释掉其他切面类(把@Aspect注释即可),仅保留MyAspect2、MyAspect3、MyAspect4 ,这样就可以清晰看到执行的结果,而不被其他切面类干扰。

  • 使用postman测试查询所有部门数据

  • 查看idea中控制台日志输出

通过以上程序运行可以看出在不同切面类中,默认按照切面类的类名字母排序:

  • 目标方法前的通知方法:字母排名靠前的先执行

  • 目标方法后的通知方法:字母排名靠前的后执行

如果我们想控制通知的执行顺序有两种方式:

  1. 修改切面类的类名(这种方式非常繁琐、而且不便管理)

  2. 使用Spring提供的@Order注解

使用@Order注解,控制通知的执行顺序:

@Slf4j
@Component
@Aspect
@Order(2)  //切面类的执行顺序(前置通知:数字越小先执行; 后置通知:数字越小越后执行)
public class MyAspect2 {//前置通知@Before("execution(* com.itheima.service.*.*(..))")public void before(){log.info("MyAspect2 -> before ...");}
​//后置通知 @After("execution(* com.itheima.service.*.*(..))")public void after(){log.info("MyAspect2 -> after ...");}
}
@Slf4j
@Component
@Aspect
@Order(3)  //切面类的执行顺序(前置通知:数字越小先执行; 后置通知:数字越小越后执行)
public class MyAspect3 {//前置通知@Before("execution(* com.itheima.service.*.*(..))")public void before(){log.info("MyAspect3 -> before ...");}
​//后置通知@After("execution(* com.itheima.service.*.*(..))")public void after(){log.info("MyAspect3 ->  after ...");}
}
@Slf4j
@Component
@Aspect
@Order(1) //切面类的执行顺序(前置通知:数字越小先执行; 后置通知:数字越小越后执行)
public class MyAspect4 {//前置通知@Before("execution(* com.itheima.service.*.*(..))")public void before(){log.info("MyAspect4 -> before ...");}
​//后置通知@After("execution(* com.itheima.service.*.*(..))")public void after(){log.info("MyAspect4 -> after ...");}
}

重新启动SpringBoot服务,测试通知执行顺序:

通知的执行顺序大家主要知道两点即可:

  1. 不同的切面类当中,默认情况下通知的执行顺序是与切面类的类名字母排序是有关系的

  2. 可以在切面类上面加上@Order注解,来控制不同的切面类通知的执行顺序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙新手入门-环境准备问题解析

Node.js版本与API配套关系 由于SDK的部分工具依赖Node.js运行时,推荐使用配套API版本的Node.js,保证工程的兼容性。 匹配关系见下表: API LevelNode.js支持范围API Level≤914.x(≥14.19.1)、16.xAPI Level>914.…

利用R语言绘制相关性热图

数据示例(归一化处理后): install.packages("corrplot") install.packages("ggplot2") install.packages("ggpubr") library(corrplot) install.packages("GGally") library(GGally) library(ggplot…

读十堂极简人工智能课笔记06_自然语言处理

1. 聊天机器人 1.1. 人工智能往往掌握不了跨越几段对话语境的讨论 1.1.1. 抓不住连贯的主题,只能单独处理每个句子 1.1.2. 不能将其答案与现实联系起来 1.1.3. 可能会遵循语言规则、统计相关性,甚至查找有关事实来为每个新句子提供答复 1.2. 聊天机…

【JVM篇】什么是类加载器,有哪些常见的类加载器

文章目录 🍔什么是类加载器🛸有哪些常见的类加载器 🍔什么是类加载器 负责在类加载过程中,将字节码信息以流的方式获取并加载到内存当中 🛸有哪些常见的类加载器 启动类加载器 启动类加载器是有Hotspot虚拟机通过的类…

ETAS安装OS Port需要注意事项

安装OS Port用来配置OS和相关的中断;按照安装手册《HowToInstallingRTA-CAR.pdf》安装完OS PORT如下位置会有安装包(正确的安装位置) VRTA为虚拟OS :没有具体芯片和编译器的试用

云原生之容器编排实践-在K8S集群中使用Registry2搭建私有镜像仓库

背景 基于前面搭建的3节点 Kubernetes 集群,今天我们使用 Registry2 搭建私有镜像仓库,这在镜像安全性以及离线环境下运维等方面具有重要意义。 Note: 由于是测试环境,以下创建了一个 local-storage 的 StorageClass ,并使用本地…

【设计模式】4、策略模式

文章目录 一、问题二、解决方案2.1 真实世界的类比2.2 策略模式结构2.3 适用场景2.4 实现方式2.5 优缺点2.6 与其他模式的关系 三、示例代码3.1 go3.2 rust 策略模式是一种行为设计模式,它能定义一系列算法,把每种算法分别放入独立的类中,以是…

【动态规划:最短编辑路径】的应用:excel diff功能

开篇说明 如果在这里获得过启发和思考,希望点赞支持!对于内容有不同的看法欢迎来信交流。 技术栈 >> java 邮箱 >> 15673219519163.com 描述 在游戏行业中通常使用excel做配表,修改配表是一个频繁的操作。在修改之后&#xff…

政安晨:【完全零基础】认知人工智能(三)【超级简单】的【机器学习神经网络】—— 三层神经网络示例

知识准备 咱们还没有演示过使用矩阵进行计算得到经由神经网络馈送的信号,我们也没有演示过多于2层的神经网络示例,在这篇文章里,咱们将构建一个三层神经网络的示例,并观察如何处理中间层的输出以作为最后第三层的输入&#xff0c…

【CSS】设置文字(文本)的渐变色

# 渐变色 文字 第一步 设置渐变颜色 background: linear-gradient(278.83deg, #5022bd 31.42%, #8636d1 75.55%); // 先设置渐变色背景; 第二步 设置颜色的使用范围 background-clip: text; // 背景被裁剪成文字的前景色。 -webkit-background-clip: text; 第三步…

Java学习笔记2024/2/18

1.API 1.1API概述 什么是API API (Application Programming Interface) :应用程序编程接口 java中的API 指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这…

【性能测试】分布式压测之locust和Jmeter的使用

受限于单台机器的配置问题,我们在单台机器上达不到一个很高的压测并发数,那这个时候就需要引入分布式压测 分布式压测原理: 一般通过局域网把不同测试计算机链接到一起,达到测试共享、分散操作、集中管理的目的。 选择一台作为…

用c语言写扫雷游戏

前言: 今天我们讲的扫雷游戏,在此过程中,我们会经常提两个字,纵横 接下来,正片开始 在开始讲解扫雷游戏之前,我们先来思考一个问题:我们之前的代码是不是都是写在一个源文件里面?那…

提升企业竞争力:精益生产培训简介——张驰咨询

精益生产(Lean Production)是一种管理哲学,最早源于日本丰田汽车公司的丰田生产系统(Toyota Production System,TPS)。这套理念的核心在于最大程度地减少生产过程中的浪费,同时保证产品质量,通过…

sora的理解

1、背景 近期, openai紧跟Runway、 Google、Meta等公司, 发布了视频生成模型Sora, 全面进军视频领域。官网的视频效果炸裂,连贯性优秀,生成视频时长可达60秒,但模拟复杂物理场景仍有瑕疵。相对Pika、Runway的效果还是有进一步提升。考虑到这…

AI界一夜变天

没有丝毫预热和剧透,Open AI深夜直接丢下核弹炸了街,从业者深感要变天。 2月16日凌晨,Open AI发布了首个“文生视频”模型Sora。官方介绍,Sora能根据文字指令创造出包含丰富细节的逼真场景、角色,且能用多角度镜头&am…

Python print函数

在Python编程中,print()函数是一个非常基础但也非常重要的函数,用于将文本或其他对象输出到控制台或文件中。本文将深入探讨Python中的print()函数,包括基本用法、格式化输出、输出重定向、实际应用场景,并提供丰富的示例代码来帮…

栈的应用(表达式求值)C++(Acwing)

代码&#xff1a; #include <iostream> #include <cstring> #include <algorithm> #include <stack> #include <unordered_map>using namespace std;stack<int> num; stack<char> op;void eval()//求值 {auto b num.top(); num.po…

echarts图表中的基本设置参数

取消显示坐标值 axisLabel: { show: false} 取消坐标轴刻度线 axisTick: { show: false} 取消网格线 splitLine: { show: false } 去除y轴的线 //写在yAxis里面 axisLine:{show:false},axisTick:{show:false},去除y轴轴线&#xff08;背景线&#xff09; splitLine…

java生成pdf

1.pdf预览 2.maven <!--pdf--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.9</version></dependency><dependency><groupId>com.itextpdf</groupId>…