【springboot】使用AOP

目录

  • 1. 添加依赖
  • 2. 创建切面类
    • 1. 创建切面类
    • 2. 切点表达式
    • 3. 增强方法
  • 3. 开启AOP
  • 4. 创建控制类
  • 5. 测试

1. 添加依赖

<!--        AOP依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2. 创建切面类

1. 创建切面类

      创建一个切面类,并使用 @Aspect 注解标记,并在这个类中定义切点和通知。

@Aspect // 表示这是一个切面
@Component // 托管到spring容器中
public class AccessRecordAspect {
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    // 定义切点 匹配TestController中的test*方法
    @Pointcut("execution(* com.huan.web.controllers.TestController.test*(..))")
    public void a(){}

    // 使用后置增强,在方法正确执行后执行
    @AfterReturning("a()")
    public void record(JoinPoint joinPoint){
        System.out.println("记录访问记录");
        // 获取目标方法参数
        Object[] args = joinPoint.getArgs();
        System.out.println(args[0]);
    }
}

2. 切点表达式

      切点表达式通用模式:execution(修饰符模式? 返回类型模式 包名.类名.方法名(参数模式) 异常模式?)
      其中的 ? 表示该部分是可选的

  • 修饰符模式:可选部分,用于匹配方法的修饰符(如 public、private 等)。例如:public。
  • 返回类型模式:用于匹配方法的返回类型。可以使用通配符 * 表示任意返回类型。例如:*。
  • 包名:用于匹配方法所在的包名。例如:com.example.service。
  • 类名:用于匹配方法所在的类名。可以使用通配符 * 表示任意类。例如:*。
  • 方法名:用于匹配方法名。可以使用通配符 * 表示任意方法。例如:*。
  • 参数模式:用于匹配方法的参数类型。可以使用通配符 … 表示任意数量和类型的参数。例如:(…)。
  • 异常模式:可选部分,用于匹配方法抛出的异常类型。例如:throws IOException。

一些常见的切点表达式示例:

execution:
    用于匹配方法执行。
    语法:execution(修饰符模式? 返回类型模式 包名.类名.方法名(参数模式) 异常模式?)
    示例:execution(* com.example.service.*.*(..)) 匹配 com.example.service 包中的所有类的所有方法。

within:
    用于匹配指定类型内的方法。
    语法:within(type-pattern)
    示例:within(com.example.service..*) 匹配 com.example.service 包及其子包中的所有类。

this:
    用于匹配当前 AOP 代理对象的类型。
    语法:this(type)
    示例:this(com.example.service.UserService) 匹配代理对象是 UserService 类型的所有方法。

target:
    用于匹配目标对象的类型。
    语法:target(type)
    示例:target(com.example.service.UserService) 匹配目标对象是 UserService 类型的所有方法。

args:
    用于匹配方法参数的类型。
    语法:args(argument-type-pattern)
    示例:args(java.lang.String) 匹配所有参数为 String 类型的方法。

@annotation:
    用于匹配方法上具有指定注解的方法。
    语法:@annotation(annotation-type)
    示例:@annotation(org.springframework.transaction.annotation.Transactional) 匹配所有带有 @Transactional 注解的方法。

@within:
    用于匹配具有指定注解的类型内的方法。
    语法:@within(annotation-type)
    示例:@within(org.springframework.stereotype.Service) 匹配所有带有 @Service 注解的类中的方法。

@target:
    用于匹配目标对象类型上具有指定注解的方法。
    语法:@target(annotation-type)
    示例:@target(org.springframework.stereotype.Service) 匹配目标对象类型上带有 @Service 注解的方法。

@args:
    用于匹配运行时传递的参数具有指定注解的方法。
    语法:@args(annotation-type)
    示例:@args(org.springframework.web.bind.annotation.RequestBody) 匹配参数带有 @RequestBody 注解的方法。

3. 增强方法

  • @Before:在目标方法执行前执行。
  • @After:在目标方法执行后执行。
  • @AfterReturning:在目标方法正常返回后执行。
  • @AfterThrowing:在目标方法抛出异常后执行。
  • @Around:环绕增强,可以在目标方法执行前后执行。

      我之前简单测试了下五种增强方法的执行顺序(文章),结论如下:

  • 无异常时  执行顺序为:环绕增强(前)-> 前置增强 -> 目标方法 -> 返回增强 -> 后置增强 -> 环绕增强(后)
  • 有异常时  执行顺序为:环绕增强(前)-> 前置增强 -> 目标方法 -> 异常增强 -> 后置增强 。

3. 开启AOP

      在配置文件中使用@EnableAspectJAutoProxy注解开启AOP功能

在这里插入图片描述

4. 创建控制类

@RestController
@RequestMapping("test")
@Tag(name = "测试",description = "测试springMVC拦截器实现记录访问次数")
public class TestController {
    @GetMapping("getInfo/{id}")
    public String test(@PathVariable Integer id) {
        switch (id){
            case 1:
                return "1";
            case 2:
                return "2";
            default:
                return "3";
        }
    }
}

5. 测试

      在浏览器中输入 http://localhost:8080/test/getInfo/1 测试aop是否生效。
在这里插入图片描述
      console输出,AOP生效。

在这里插入图片描述
      over…
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

不会抖音剪辑怎么办?这4款拿走不谢

不少人想做自媒体&#xff0c;但是就光视频剪辑这一点难住了不少人&#xff0c;其实视频剪辑并没有大家想的那么复杂&#xff0c;直接用一些简单的剪辑视频工具也可以处理。作为一个短视频剪辑新手&#xff0c;我最近尝试了几款流行的视频编辑软件&#xff0c;今天就来和大家分…

C++引用简介

引用的基本使用&#xff1a; 作用&#xff1a; 给变量起别名 语法&#xff1a; 数据类型 &别名 原名 int main() {int a 10;int &b a;cout << "a " << a << endl;cout << "b " << b << endl; //都打印…

WebRTC协议下的视频汇聚融合技术:EasyCVR视频技术构建高效视频交互体验

视频汇聚融合技术是指将来自不同源、不同格式、不同网络环境的视频流进行集中处理、整合和展示的技术。随着视频监控、远程会议、在线教育、直播娱乐等领域的快速发展&#xff0c;视频数据的规模急剧增长&#xff0c;对视频处理能力和效率提出了更高要求。视频汇聚融合技术通过…

面试软件测试需要掌握的技能有哪些?

一、测试用例的编写 1、在测试中最重要的文档&#xff0c;他是测试工作的核心&#xff0c;是一组在测试时输入输出的标准&#xff0c;是软件需求的具体对照。编写测试用例&#xff0c;是测试人员的基本功&#xff0c;真正能写好的人并不多。 测试用例包含的内容&#xff1a; …

原型与原型链

在JavaScript中&#xff0c;原型&#xff08;prototype&#xff09;和原型链&#xff08;prototype chain&#xff09;是理解对象如何继承属性和方法的关键概念。 原型 每一个对象&#xff08;函数也是对象&#xff09;都有一个特殊的属性叫做原型&#xff08;prototype&…

数据分析-11-时间序列分析的概念任务和主要方法

1 时间序列 1.1 时间序列的定义 时间序列,通俗的字面含义为一系列历史时间的序列集合。比如2013年到2022年我国全国总人口数依次记录下来,就构成了一个序列长度为10的时间序列。 结合上图理解随机变量和观测值的关系。 我们认为每个时间点发生的数据都来自于一个分布的,…

PDF文件压缩,总结了五种压缩方法

PDF文件压缩&#xff0c;PDF文件在日常工作和生活中非常常见&#xff0c;但由于其体积较大&#xff0c;传输和上传时常会遇到限制。为了有效解决这一问题&#xff0c;PDF文件的压缩变得尤为重要。为了帮助你轻松应对大文件传输的困扰&#xff0c;本文将为你归纳五种实用的PDF文…

代码审计总结

代码审计总结 概述 一、代码审计 1.1什么是代码审计&#xff1f; 1.2为什么要执行代码审核&#xff1f; 1.3代码审计的好处 二、代码审计流程 2.1代码检查方法 2.2代码检查项目 2.3编码规范 2.4代码检查规范 2.5缺陷检查表 2.6代码审计复查 2.7代码审计结果总结 三…

前端代码注释风格 - CSS篇

本文基于《阿里巴巴CSS编程规约》、stylelint rules进行编写&#xff0c;涉及预编译语言&#xff08;Sass、Less&#xff09;的编码风格和最佳实践。 1.1 编码风格 空格的使用 选择器和{之间保留一个空格。.selector-disabled { 在使用逗号分隔的属性中&#xff0c;逗号后保…

HTTP 二、进阶

四、安全 1、TLS是什么 &#xff08;1&#xff09;为什么要有HTTPS ​ 简单的回答是“因为 HTTP 不安全”。由于 HTTP 天生“明文”的特点&#xff0c;整个传输过程完全透明&#xff0c;任何人都能够在链路中截获、修改或者伪造请求 / 响应报文&#xff0c;数据不具有可…

k8s 部署 jenkins【详细步骤】

文章目录 部署介绍部署步骤第 1 步:创建 namespace第 2 步:创建 ServiceAccount第 3 步:创建持久卷第 4 步:创建 Deployment第 5 步:创建 Service第 6 步:浏览器访问 Jenkins第 7 步:修改默认时区参考⭐ 本文目标:在 k8s 集群中部署一个 jenkins。 部署介绍 🚀 在 K…

查看HBA卡是否支持FC协议

cat /sys/class/fc_host/host*/port_name lspci | grep -i fibre # 看有无fibre channel控制器 官网查询 Emulex Lpe32000 https://docs.broadcom.com/doc/12357773 https://cn.genuinemodules.com/image/catalog/pdf/18/LPe32000.pdf

pnpm国内源设置

一、背景 在国内使用pnpm时&#xff0c;由于网络问题&#xff0c;经常会遇到速度慢或无法访问的问题。为了提高效率&#xff0c;可以将pnpm的源设置为国内的镜像源。以下是一些常用的国内pnpm镜像源以及如何设置它们的方法。 二、国内可用源 2.1 淘宝pnpm源 https://registry…

OceanBase 功能解析之 Binlog Service

前言 MySQL&#xff0c;是在全球广泛应用的开源关系型数据库&#xff0c;除了其稳定性、可靠性和易用性&#xff0c;他早期推出的二进制日志功能&#xff0c;即binlog&#xff0c;也是MySQL广受欢迎的原因。 MySQL binlog&#xff0c;即二进制日志&#xff0c;是 MySQL 中用于…

[数据集][目标检测]电梯内广告牌电动车检测数据集VOC+YOLO格式2787张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2787 标注数量(xml文件个数)&#xff1a;2787 标注数量(txt文件个数)&#xff1a;2787 标注…

中间件解析了漏洞【IIS Nginx Apache】

IIS 1.IIS6.X 1.使用Windows2003虚拟机&#xff0c;在其中安装IIS6.X 2.在IIS6.X中&#xff0c;.asp文件夹中的文件都会被当作asp文件去执行 我们在网站根目录创建一个x.asp文件 在x.asp中新建⼀个jpg⽂件。内容为<%now()%> asp代码。 在外部浏览器中访问windows2…

鸿蒙轻内核M核源码分析系列五 时间管理

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 持续更新中…… 在鸿蒙轻内核源码分析上一篇文章中&#xff0c;我们剖析了中断的源码&#xff0c;简单提到了Tick中断。本文会继续分析Tick和时间相关的源…

AMD MI300X vs Nvidia H100/H200:AI计算领域的新一轮较量

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;计算引擎的性能竞赛也愈演愈烈。近期&#xff0c;MLCommons发布的最新AI训练和推理基准测试结果&#xff0c;他们构建了一套 MLPerf AI 训练和推理基准&#xff0c;将AMD的Instinct“Antares”MI300X GPU与Nv…

远端ide ,vscode ,python 开发环境, 有些还有一建生成chatgpt功能,支持gpu功能

现在智能化的AI工具&#xff0c;可以实现智能聊天、文本生成、语言翻译等多种功能。 博主归纳总结了6个好用免费的AI工具网站&#xff0c;供大家参考。 ## 1&#xff0c;insCode 网址&#xff1a; https://inscode.csdn.net/ 简介&#xff1a; InsCode 是一个以“灵感”&am…

SQL-多表查询

1、多表关系 一对多、多对一&#xff1a;在多的一方建立外键&#xff0c;指向一的一方。 多对多&#xff1a;至少两个外键&#xff0c;通过中间表维护。 一对一 2、多表查询概述 3、内连接 4、外连接 5、自连接 6、联合查询 7、子查询 8、多表查询案例 # 1、多表关系 #…