Spring AOP 代码案例

目录

AOP组成

通知的具体方法类型

引入Spring AOP依赖

定义AOP层

UserController

Postman测试

AOP工作流程


AOP组成

  • 切面 : 切⾯(Aspect)由切点(Pointcut)和通知(Advice)组成,它既包含了横切逻辑的定义,也包括了连接点的定义,切⾯是包含了:通知、切点和切⾯的类,相当于 AOP 实现的某个功能的集合
  • 连接点 : 应⽤执⾏过程中能够插⼊切⾯的⼀个点,这个点可以是⽅法调⽤时,抛出异常时,甚⾄修改字段时。切⾯代码可以利⽤这些点插⼊到应⽤的正常流程之中,并添加新的⾏为. 
  • 切点 : Pointcut 是匹配 Join Point 的谓词,切点相当于保存了众多连接点的⼀个集合(如果把切点看成⼀个表,⽽连接点就是表中⼀条⼀条的数据
  • 通知 : 切⾯的⼯作被称之为通知, 实现的这个切面提供什么功能

通知的具体方法类型

  • 前置通知: @Before, 通知方法会在目标方法执行之前执行
  • 后置通知: @After, 通知⽅法会在⽬标⽅法返回或者抛出异常后调⽤
  • 返回之后通知: @AfterReturning, 通知方法会在目标返回后调用
  • 抛异常后通知: @AfterThrowing , 通知方法会在抛出异常后调用
  • 环绕通知: @Around, 通知包裹了被通知的⽅法,在被通知的⽅法通知之前和调⽤之后执
    ⾏⾃定义的⾏为

引入Spring AOP依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

 

定义AOP层

@Aspect // 定义这个类为切面
@Component // 让这个类随着spring项目的启动而注入被自动识别
public class UserAspect {// 定义切点@Pointcut("execution(* *com.example.springaoptest1.userController.UserController.*(..))")  // 定义切点public void pc(){};@Before("pc()")public void doBefore() {System.out.println("执行前置通知");}@Around("pc()")public Object doAroud(ProceedingJoinPoint joinPoint) {System.out.println("环绕通知开始执行");Object ret;try {ret = joinPoint.proceed();} catch (Throwable e) {throw new RuntimeException(e);}System.out.println("环绕通知执行之后");return ret;}}

UserController

@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/getUser")public String getUser() {System.out.println("do getUser!");return "user";}@RequestMapping("/delUser")public String delUser() {System.out.println("do delUser!");return "del user";}
}

Postman测试

 

AOP工作流程

  1. Spring容器启动
  2. 读取所有配置中的切入点
  3. 初始化bean, 判定bean对应的类中的方法是否匹配到任意切入点
    1. 匹配失败, 创建对象
    2. 匹配成功, 创建原始对象的代理对象
  4. 获取bean执行方法
    1. 获取bean, 调用方法并执行, 完成操作
    2. 获取的是bean代理对象, 根据代理对象的运行模式, 运行原始方法, 增强的内容, 完成操作

        



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

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

相关文章

如何生成纯文本的目录树

参考资料&#xff1a; https://ascii-tree-generator.com/ 无需多言&#xff0c;感谢这些前辈的智慧。界面如下&#xff1a;

Elasticsearch:使用 ILM 示例运行降采样 (downsampling)

如果你对降采样还不是很熟的话&#xff0c;请阅读之前的文章 “Elasticsearch&#xff1a;对时间序列数据流进行降采样&#xff08;downsampling)”。这是一个简化的示例&#xff0c;可让你快速了解降采样如何作为 ILM 策略的一部分来减少一组采样指标的存储大小。 该示例使用典…

机器学习第14天:KNN近邻算法

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 介绍 实例 回归任务 缺点 实例 分类任务 如何选择最佳参数 结语 介绍 KNN算法的核心思想是&#xff1a;当我们要判断一个数据为哪一类时…

Find My键盘|苹果Find My技术与键盘结合,智能防丢,全球定位

键盘是最常用也是最主要的输入设备&#xff0c;通过键盘可以将英文字母、汉字、数字、标点符号等输入到计算机中&#xff0c;从而向计算机发出命令、输入数据等。还有一些带有各种快捷键的键盘。随着时间的推移&#xff0c;渐渐的市场上也出现独立的具有各种快捷功能的产品单独…

10个让UI设计更轻松的工具

UI设计软件对设计师来说非常重要。UI设计工具的使用是否直接影响到最终结果的质量&#xff0c;然后有人会问&#xff1a;UI界面设计使用什么软件&#xff1f;这里有一些UI设计师和那些对UI设计感兴趣的朋友列出了10个易于使用和免费的UI设计软件。 即时设计 即时设计是一款免…

【社会网络分析第6期】Ucient实操

一、导入数据处理二、核心——边缘分析三、聚类分析四、网络密度 一、导入数据处理 将数据导入Ucinet首先需要对数据进行处理。 承接上一期的数据格式&#xff1a;【社会网络分析第5期】gephi使用指南 原先得到的数据格式如下&#xff1a; 接下来打开ucinet&#xff1a; 之后…

HI3559AV100下对emmc总线速率的调整

先前使用3559开发板时&#xff0c;一直没觉得emmc会是个问题&#xff0c;但是最近一个国产化的项目中3559配合的是一款国产128G的emmc&#xff0c;因为板上面积限制&#xff0c;走线有点限制&#xff0c;导致uboot启动emmc有时候会失败。 1、报错的打印如下&#xff1a; MMC …

【机器视觉技术】:开创人工智能新时代

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; IT杂谈 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1; 前言&#x1f324;️ 机器视觉技术的实现☁️ 图像采集☁️ 图像处理☁️ 数据建模☁️应用展示…

Phpstudy v8.0/8.1添加 php-7.4.9

1、官网下载最新的php版本 打开Windows版的官网下载&#xff0c;地址&#xff1a;PHP For Windows: Binaries and sources Releases 页面上有不同的PHP版本&#xff0c;这里我们下载的是64位nts版的PHP7.4.9&#xff0c;php-7.4.9-nts-Win32-vc15-x64.zip。 2、解压下载的文…

segment-anything安装教程

文章目录 一. segment-anything安装教程 一. segment-anything安装教程 官网安装说明:https://github.com/facebookresearch/segment-anything anaconda下新建一个环境 conda create -n sam python3.8激活新建的环境 conda activate sam更换conda镜像源 conda config --add ch…

XUbuntu22.04之OBS30.0设置录制音频降噪(一百九十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Nacos作为配置中心的一些知识二

11292327 问&#xff1a;客户端发请求给Nacos服务端&#xff0c;服务端这边会进行哪些处理&#xff1f; 答&#xff1a;客户端发请求给Nacos 服务端 &#xff0c;服务端这边通过ConfigController类的309行的listener方法&#xff0c;进行处理 第一步 获取客户端请求的文件的…

中职组网络安全-web-PYsystem003.img-(环境+解析)

​ web安全渗透 1.通过URL访问http://靶机IP/1&#xff0c;对该页面进行渗透测试&#xff0c;将完成后返回的结果内容作为flag值提交&#xff1b; 访问该网页后发现F12被禁用&#xff0c;使用ctrlshifti查看 ctrlshifti 等效于 F12 flag{fc35fdc70d5fc69d269883a822c7a53e}…

SpringCloud核心组件

Eureka 注册中心&#xff0c;服务的注册与发现 Feign远程调用 Ribbon负载均衡&#xff0c;默认轮询 Hystrix 熔断 降级 Zuul微服务网关&#xff08;这个组件负责网络路由&#xff0c;可以做统一的降级、限流、认证授权、安全&#xff09; Eureka 微服务的功能主要有以下几…

有时出厂重置BIOS是解决电脑问题和保持其最佳性能的好办法,主要有两种方法

​BIOS是计算机开机时启动的第一个程序&#xff0c;它有助于执行一些基本的计算机操作&#xff0c;并管理计算机和安装在计算机上的操作系统之间的命令。与任何其他程序一样&#xff0c;如果在启动计算机时遇到问题或在计算机中添加了新硬件&#xff0c;则可能需要将BIOS重置为…

JMeter怎样测试WebSocket

一、安装WebSocket取样器 1、从JMeter插件管理器官网下载&#xff1a; https://jmeter-plugins.org/ 搜索websocket 1、jetty-http-9.1.2.v20140210.jar 2、jetty-io-9.1.2.v20140210.jar 3、jetty-util-9.1.2.v20140210.jar 4、websocket-api-9.1.1.v20140108.jar 5、w…

【Windows】内网穿透实现hMailServer远程发送邮件

目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网…

2023认证杯小美赛数学建模国际赛ABCD题思路及python代码分享

大家好呀&#xff0c;认证杯小美赛数学建模开始了&#xff0c;来说一下初步的选题建议吧&#xff1a; 首先定下主基调&#xff0c; 本次小美赛难度&#xff1a;D&#xff1c;A≈C&#xff1c;B。推荐选择D题。预计12.2中午更新D完整论文。预定论文请往后滑看完本文档链接。 A…

Day02嵌入式---按键控灯

一、简单介绍 按键控制灯开关是一种常见的嵌入式系统示例项目&#xff0c;它通常用于演示嵌入式系统的基本控制能力。该项目由一个或多个LED和一个按键组成。通过按下按键&#xff0c;可以控制LED的开关状态&#xff0c;从而实现灯的亮灭控制。 二、查看功能手册 2.1 查看硬件…

Windows核心编程 HOOK

目录 HOOK概述 HOOK API SetWindowsHookExA 函数(winuser.h) UnhookWindowsHookEx 函数(winuser.h) NextHookEx 函数(winuser.h) 局部钩子 全局钩子 为什么全局钩子需要用dll作为过程函数&#xff1f; HOOK概述 本质&#xff1a;Windows消系统的消息过滤器。 全局钩子…