spring aop实际开发中怎么用,Spring Boot整合AOP,spring boot加spring mvc一起使用aop,项目中使用aop

前言:本文不介绍 AOP 的基本概念、动态代理方式实现 AOP,以及 Spring 框架去实现 AOP。本文重点介绍 Spring Boot 项目中如何使用 AOP,也就是实际项目开发中如何使用 AOP 去实现相关功能。

如果有需要了解 AOP 的概念、动态代理实现 AOP 的,请查看我的另外一篇文章:

一篇文章带你深入了解 AOP


正文开始:


Spring Boot中实际应用AOP

1、之前介绍的实现 AOP 的方式中是有 XML 文件设置。但在 Spring Boot 中,没有 XML 文件,那怎么设置 AOP?

2、实际应用中:MVC三层架构,现需要在控制器中统一进行日志的输出(有各种各样的控制器),那怎么实现?(也就是说实际应用中如何实现?)

1、Cal 接口、CalIml 接口实现类 还是跟 Spring框架实现AOP 中一样。之前的两个依赖不要,添加这个依赖:

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

2、控制器中需要打印日志,比如:调控制器中的哪个方法(接口)、方法有哪些参数、返回值。当然,你肯定可以在每个方法中写,但显然这不现实。这里用 AOP 方法将打印日志抽离出来,然后需要的时候嵌入到每个方法中

//以下代码仅是为了测试,代码不规范,请注意。@RestController
@RequestMapping("/aop")
public class AopSpringBootTestHandler {@GetMapping("/findAll")public List<Account> findAll() {return Arrays.asList(new Account(1, "张三", 25), new Account(2, "李四", 26));}@GetMapping("/findById/{id}")public Account findById(@PathVariable Integer id) {return new Account(1, "张三", 25);}@GetMapping("/add")public boolean add() {return true;}@GetMapping("/update")public boolean update() {return true;}@GetMapping("/delete/{id}")public boolean delete(@PathVariable Integer id) {return true;}
}

自定义注解

3、自定义注解(比如:创建一个 annotation 的包,然后创建一个 LogAnnotation(可自定义,比如这里是打印日志的注解))

为什么要这个自定义注解?----> 首先你要让 AOP 知道你调了哪些方、哪些方法需要让 AOP 进行处理,所以就要让 AOP 知道这些方法,怎么知道? ----> 通过自定义注解

其次并不是所有的方法都需要进行 AOP 处理,所以通过 注解 标记。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {//使用注解时,给注解中添加值String value() default "";
}

说明:@Target、@Retention、@Documented 都是元注解(描述注解的注解)

@Target 表示该注解的使用目标,其中 @Target(ElementType.METHOD) 表示只能使用在方法上:

@Retention(RetentionPolicy.RUNTIME) 表示在运行时使用该注解。

@interface 标志这是一个注解。

String value() default ""; 固定写法,表示在使用注解的时候,可以添加值,默认为空:

**使用自定义注解:**需要进行 AOP 处理的方法,标记即可

4、标记完后,同理,需要切面类,执行非业务代码(比如这里是输出日志):

@Component
@Aspect
public class CreateAspectUtil {/*我们利用自定义注解标记了哪些方法需要进行AOP处理,那真正需要处理的时候,怎么找到这些标记?通过 Pointcut(切入点)找到这些标记所以这个方法就是为了找到标记,必须是空方法体*/@Pointcut("@annotation(com.example.test.aopspringboottest.annotation.LogAnnotation)")public void logPointCut() {}/*找到标记后,怎么执行日志?1、跟之前一样,有@Before前置通知、@After后置通知等等@Around注解就是将各种通知统一到一起,然后将找标记的方法放进去2、连接点 ProceedingJoinPoint 是 joinPoint 的子接口,只是ProceedingJoinPoint中有这个proceed()方法,为了获取方法的返回值*/@Around("logPointCut()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {String methodName = joinPoint.getSignature().getName();String methodArgs = Arrays.toString(joinPoint.getArgs());System.out.println(methodName + "方法的参数是:" + methodArgs);return joinPoint.proceed(); //返回目标方法(也就是业务代码)中的返回值}
}

演示: 启动启动类后,直接访问:

没加标记的就不会打印日志。

注意:现在还要求输出自定义注解中的值, 怎么办?----> 通过反射获取注解即可

既然获取注解,注解是添加在方法上的,所以先通过反射获取方法,怎么获取?----> 只有一个连接点,所以还是通过连接点:

@Around("logPointcut()")
public Object around(ProceedingJointPoint jointPoint) throws Throwable {//通过连接点获取到方法的签名MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();//通过方法签名获取到方法Method method = methodSignature.getMethod();//拿到方法后,拿注解:把自定义注解的运行时类给它LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);if (annotation != null) {//拿注解中的值,通过里面的value方法String value = annotation.value();//这个value就是注解里面的内容System.out.println(value);}
}

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

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

相关文章

Spark集群部署与架构

在大数据时代&#xff0c;处理海量数据需要分布式计算框架。Apache Spark作为一种强大的大数据处理工具&#xff0c;可以在集群中高效运行&#xff0c;处理数十TB甚至PB级别的数据。本文将介绍如何构建和管理Spark集群&#xff0c;以满足大规模数据处理的需求。 Spark集群架构…

LLM微调(四)| 微调Llama 2实现Text-to-SQL,并使用LlamaIndex在数据库上进行推理

Llama 2是开源LLM发展的一个巨大里程碑。最大模型及其经过微调的变体位居Hugging Face Open LLM排行榜&#xff08;https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard&#xff09;前列。多个基准测试表明&#xff0c;就性能而言&#xff0c;它正在接近GPT-3.5…

光耦继电器

光耦继电器(光电继电器) AQW282SX 282SZ 280SX 280SZ 284SX 284SZ 212S 212SX 21 2SZ 文章目录 光耦继电器(光电继电器)前言一、光耦继电器是什么二、光耦继电器的类型三、光电耦合器的应用总结前言 光耦继电器在工业控制、通讯、医疗设备、家电及汽车电子等领域得到广泛应…

【隐私保护】Presidio简化了PII匿名化

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

YOLOv8改进 | 2023注意力篇 | MSDA多尺度空洞注意力(附多位置添加教程)

一、本文介绍 本文给大家带来的改进机制是MSDA&#xff08;多尺度空洞注意力&#xff09;发表于今年的中科院一区(算是国内计算机领域的最高期刊了)&#xff0c;其全称是"DilateFormer: Multi-Scale Dilated Transformer for Visual Recognition"。MSDA的主要思想是…

STM32F407-14.3.10-表73具有有断路功能的互补通道OCx和OCxN的输出控制位-1x111

如上表所示&#xff0c;MOE1&#xff0c;OSSR1&#xff0c;CCxE1&#xff0c;CCxNE1时&#xff0c;OCx与OCxN对应端口的输出状态取决于OCx_REF与极性选择&#xff08;CCxP&#xff0c;CCxNP&#xff09; 死区。 -------------------------------------------------------------…

记pbcms网站被攻击,很多标题被篡改(1)

记得定期打开网站看看哦! 被攻击后的网站异常表现:网页内容缺失或变更,页面布局破坏,按钮点击无效,...... 接着查看HTML、CSS、JS文件,发现嵌入了未知代码! 攻击1:index.html 或其他html模板页面的标题、关键词、描述被篡改(俗称,被挂马...),如下: 攻击2:在ht…

【PostGIS】PostgreSQL15+对应PostGIS安装教程及空间数据可视化

一、PostgreSQL15与对应PostGIS安装 PostgreSQL15安装&#xff1a;下载地址PostGIS安装&#xff1a;下载地址&#xff08;选择倒数第二个&#xff09; 1、PostgreSQL安装 下载安装包&#xff1b;开始安装&#xff0c;这里使用默认安装&#xff0c;一直next直到安装完成&…

ubuntu下docker安装,配置python运行环境

参考自: 1.最详细ubuntu安装docker教程 2.使用docker搭建python环境 首先假设已经安装了docker&#xff0c;卸载原来的docker 在命令行中运行&#xff1a; sudo apt-get updatesudo apt-get remove docker docker-engine docker.io containerd runc 安装docker依赖 apt-get…

饥荒Mod 开发(二一):超大便携背包,超大物品栏,永久保鲜

饥荒Mod 开发(二十)&#xff1a;显示打怪伤害值 饥荒Mod 开发(二二)&#xff1a;显示物品信息 源码 游戏中的物品栏容量实在太小了&#xff0c;虽然可以放在箱子里面但是真的很不方便&#xff0c;外出一趟不容易看到东西都不能捡。实在是虐心。 游戏中的食物还有变质机制&#…

SSTI模板注入基础(Flask+Jinja2)

文章目录 一、前置知识1.1 模板引擎1.2 渲染 二、SSTI模板注入2.1 原理2.2 沙箱逃逸沙箱逃逸payload讲解其他重要payload 2.3 过滤绕过点.被过滤下划线_被过滤单双引号 "被过滤中括号[]被过滤关键字被过滤 三、PasecaCTF-2019-Web-Flask SSTI参考文献 一、前置知识 1.1 模…

力扣:51. N 皇后

题目&#xff1a; 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的…

多维时序 | MATLAB实现SSA-CNN-SVM麻雀算法优化卷积神经网络-支持向量机多变量时间序列预测

多维时序 | MATLAB实现SSA-CNN-SVM麻雀算法优化卷积神经网络-支持向量机多变量时间序列预测 目录 多维时序 | MATLAB实现SSA-CNN-SVM麻雀算法优化卷积神经网络-支持向量机多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | MATLAB实现…

ubuntu22.04 下载路径

ftp下载路径 csdn下载 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.001资源-CSDN文库 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.002资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.003资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.004资源-…

大数据应用开发1——配置基础环境

一、基础环境配置 1.配置虚拟网络 1.1、点击1、编辑2和3&#xff0c; 1.2、点开4&#xff0c;编辑网关 2、配置虚拟机环境 1.1、安装一台虚拟机&#xff0c;使用root用户登录&#xff0c;打开终端 1.2修改主机名 终端输入&#xff1a; vim /etc/hostname使用vim编辑/etc/ho…

linux异步IO的几种方法及重点案例

异步IO的方法 在Linux下&#xff0c;有几种常见的异步I/O&#xff08;Asynchronous I/O&#xff09;机制可供选择。以下是其中一些主要的异步I/O机制&#xff1a; POSIX AIO&#xff08;Asynchronous I/O&#xff09;&#xff1a;POSIX AIO是一种标准的异步I/O机制&#xff0c…

三道C语言中常见的笔试题及答案(一)

题目一&#xff1a; 问题&#xff1a; 解释以下代码中的#define预处理指令的作用&#xff0c;并说明其优点和缺点。 #include <stdio.h> #define PI 3.14159 #define CALCULATE_AREA(r) (PI * r * r) int main() { double radius 5.0; double area CALCULATE_AREA(r…

基于STM32的DS1302实时时钟模块应用

DS1302是一款低功耗的实时时钟芯片&#xff0c;被广泛应用于各种电子产品中。它具有准确计时、多种时间格式表示、定时报警等功能&#xff0c;适用于记录时间、日期和闹钟。在本文中&#xff0c;我们将介绍如何在基于STM32的开发环境中使用DS1302实时时钟模块&#xff0c;并给出…

设计模式--命令模式

实验16&#xff1a;命令模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解命令模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用命令模式解决实际问题。 [实验任务]&#xff1a;多次撤销和重复的命令模式 某系…

智能优化算法应用:基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.孔雀算法4.实验参数设定5.算法结果6.参考文献7.MA…