Spring AOP的实现方式

AOP基本概念

Spring框架的两大核心:IoC和AOP

AOP:Aspect Oriented Programming(面向切面编程)

           AOP是一种思想,是对某一类事情的集中处理

面向切面编程:切面就是指某一类特定的问题,所以AOP可以理解为面向特定方法编程

举例:拦截器是AOP的一种应用

“特定问题”:登录校验

针对特定问题统一处理:登录校验拦截器

Spring对AOP进行了实现,并且提供了一些API,就是Spring AOP

AOP的作用:

拦截器作用的维度是URL(⼀次请求和响应), @ControllerAdvice 应用 场景主要是全局异常处理
(配合自定义异常效果更佳), 数据绑定, 数据预处理。
AOP作用的维度更加细致(可以根据包、类、方法名、参数等进行拦截), 能够实现更加复杂的业务逻辑。

AOP开发步骤

举例:往之前的图书管理系统中创建一个切面aspect,打印每个接口的耗时。

引入AOP依赖

在pom.xml文件中添加配置

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

编写AOP程序

打印每个接口的耗时

@Component//交给Spring管理
@Slf4j//打印日志
@Aspect//表明改类为切面
public class TimeAspect {
    // @Around定义哪些是目标方法
    @Around("execution(*  com.example.SpringBookaliyun.controller.*.*(..))")
    public Object timeCost(ProceedingJoinPoint joinPoint) throws Throwable {
        //ProceedingJoinPoint表示作用的目标方法
        long start=System.currentTimeMillis();
        //执行目标方法
       Object result=joinPoint.proceed();
        long end=System.currentTimeMillis();
        log.info(joinPoint+"消耗时间:"+(end-start)+"ms");
        return result;
    }
}

通过上面的程序, 我们也可以感受到AOP面向切面编程的⼀些优势:

代码无侵入: 不修改原始的业务方法, 就可以对原始的业务方法进行功能的增强或者是功能的改变

减少了重复代码

提高开发效率

维护方便

AOP详解

1.切点:切入点 ,一组规则,通过表达式来描述

@Around("execution(*  com.example.SpringBookaliyun.controller.*.*(..))")

2.连接点:目标方法就是连接点;切点描述的方法

图书管理系统中controller下的所有方法(add、delete.....)

3.通知:具体的逻辑,要做的处理

4.切面:切点+通知

通知(advice)

Spring中AOP的通知类型有以下几种:

@Around: 环绕通知, 此注解标注的通知方法在目标方法前, 后都被执行

@Before: 前置通知, 此注解标注的通知方法目标方法前被执行 

@After: 后置通知, 此注解标注的通知方法目标方法后被执行, 无论是否有异常都会执行

@AfterReturning: 返回后通知, 此注解标注的通知方法目标方法后被执行, 有异常不会执行 

@AfterThrowing: 异常后通知, 此注解标注的通知方法发生异常后执行  

简单做一个测试:

测试结果:

先执行around,再执行before;先执行after,再执行around

当添加一个异常的接口,执行异常接口的时候,观察控制台的顺序:

切点

@PointCut
当有多个切面的时候,切面的执行顺序按照名称进行排序。但观察比较麻烦,下面介绍切面优先级。

切面优先级(@Order)

当我们在⼀个项目中, 定义了多个切面类时, 并且这些切面类的多个切入点都匹配到了同⼀个目标方法. 当目标方法运行的时候,运行顺序不方便管理。

Spring 给我们提供了一个新的注解, 来控制这些切面通知的执行顺序:@Order

使用@Order时,数字越小,优先级越高

切点表达式

切点表达式常见有两种表达⽅式

1. execution(RR):根据方法的签名来匹配

2. @annotation(RR) :根据注解匹配

execution表达式

execution(<访问修饰符> <返回类型> <包名.类名.⽅法(⽅法参数)> <异常>)

访问修饰符和异常可以省略

//切点表达式⽰例 

//TestController 下的 public修饰, 返回类型为String ⽅法名为t1, ⽆参⽅法 
    execution(public String com.example.demo.controller.TestController.t1())
//省略访问修饰符 
    execution(String com.example.demo.controller.TestController.t1()) 
//匹配所有返回类型 
    execution(* com.example.demo.controller.TestController.t1())
//匹配TestController 下的所有⽆参⽅法 
    execution(* com.example.demo.controller.TestController.*()) 
//匹配TestController 下的所有⽅法
    execution(* com.example.demo.controller.TestController.*(..)) 
//匹配controller包下所有的类的所有⽅法 
    execution(* com.example.demo.controller.*.*(..)) 
//匹配所有包下⾯的TestController 
    execution(* com..TestController.*(..))
//匹配com.example.demo包下, ⼦孙包下的所有类的所有⽅法
    execution(* com.example.demo..*(..))

@annotation注解匹配

execution表达式更适用有规则的, 如果我们要匹配多个无规则的方法时, 例如:TestController中的t1() 和UserController中的u1()这两个方法.

这个时候使用execution这种切点表达式来描述比较麻烦。

此时使用@annotation 来描述这一类的切点

实现步骤:

1. 编写自定义注解

2. 使用@annotation 表达式来描述切点

3. 在连接点的方法上添加自定义注解

1. 编写自定义注解

2. 使用@annotation 表达式来描述切点

3. 在连接点的方法上添加自定义注解

此时只有执行h1和t2时,控制台才会出现对切点的描述

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

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

相关文章

CMake进行C/C++与汇编混合编程

1. 前提 这篇文章记录一下怎么用CMake进行项目管理, 并用C/C和汇编进行混合编程, 为了使用这项技术, 必须在VS的环境中安装好cmake组件 由于大部分人不会使用C/C与汇编进行混合编程的情况。所以这篇文章并不适用于绝大部分人不会对其中具体细节进行过多叙述。只是做一些简单的…

Java的集合框架和泛型

文章目录 集合框架什么是集合框架类和接口总览 集合框架的重要性背后所涉及的数据结构以及算法什么是数据结构容器背后对应的数据结构什么是算法 包装类基本数据类型和对应的包装类装箱和拆箱自动装箱和自动拆箱 泛型什么是泛型引出泛型语法泛型类泛型的上界(没有下界)泛型方法…

知识图谱:py2neo导入周杰伦歌单csv文件

文章目录 py2neo导入csv文件py2neo导入周杰伦歌单csv效果展示 py2neo导入csv文件 之前写的知识图谱指南 知识图谱&#xff1a;py2neo将csv文件导入neo4j 因为没有区分不同实体entity的类型&#xff0c;所以颜色相同&#xff0c;无法相互区分歌手、歌曲还是专辑等等。 py2ne…

Linux下的自动化任务与计划任务:让你的系统更智能

在日常的Linux系统管理中&#xff0c;你是否经常需要定时执行某些任务&#xff0c;或者希望在系统启动时自动运行某些脚本&#xff1f;如果是的话&#xff0c;那么自动化任务和计划任务将是你的得力助手。它们可以帮助你提高系统效率、减少人工干预&#xff0c;并确保任务能够按…

绿色化 数据库 MongoDB 和 mysql 安装

绿色化 数据库 MongoDB 和 mysql 安装 【1.1】 前言 为什么要绿色化 安装呢&#xff1f;因为系统老升级&#xff0c;老重装&#xff01;&#xff01;也方便了解下数据库配置和库在那 绿色软件喜欢一般放在 D盘tools目录里 D:\tools\ 数据库 MongoDB D:\tools\MongoDB 数…

制作怎么自己搭建一个网站

制作怎么自己搭建一个网站 一.领取一个免费域名和SSL证书&#xff0c;和CDN 1.打开网站链接&#xff1a;https://www.rainyun.com/ycpcp_ 首先创建一个CDN&#xff0c;这里以我加速域名“cdntest.biliwind.com 1”为例 这里就要填写 cdntest.biliwind.com 1 &#xff0c;而…

【王道数据结构】【chapter5树与二叉树】【P159t15】

设计一个算法将二叉树的叶结点从左到右的顺序连成一个单链表&#xff0c;表头指针为head。二叉树按二叉链表方式存储&#xff0c;链接时用叶结点的右指针来存放单链表指针。 #include <iostream> #include <stack> #include <queue> typedef struct treenode…

2024-02-16 AIGC-数字人-平台调研-记录

摘要: 2024-02-16 AIGC-数字人-平台调研 需求分析: 数字人-平台调研 南京硅基智能北京风平智能[风平科技]品达集团[杭州品达企服科技(集团)有限公司]花脸数字技术灰豚数字人[温州专帮信息科技有限公司]魔珐科技数字栩生公司官网guiji-ows风平智能 - 领先的AIGC解决方案提供商。…

AI:130-基于深度学习的室内导航与定位

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

Springboot的it职业生涯规划系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; Springboot的it职业生涯规划系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&a…

2024下载使用CleanMyMac X软件时需要注意什么?

使用CleanMyMac X清理系统垃圾文件的步骤如下&#xff1a; 打开CleanMyMac X软件。在主界面中&#xff0c;选择“清理”功能块下的“清理系统垃圾”选项。点击“扫描”按钮&#xff0c;软件将自动扫描系统垃圾&#xff0c;包括缓存文件、系统日志文件等。扫描完成后&#xff0…

Kotlin基础——类、对象和接口

文章目录 1 定义类继承结构1.1 接口1.1.1 接口概述1.1.2 接口中的默认方法1.1.3 接口方法重复1.1.4 Kotlin接口中静态方法实现原理 1.2 修饰符1.2.1 类继承修饰1.2.2 方法重写修饰1.2.3 抽象类1.2.4 接口的修饰符 1.3 可见性修饰符1.3.1 Kotlin中的可见性修饰符1.3.2 Kotlin中的…

开源个人订阅跟踪器Wallos

本文软件由网友 P家单推人 推荐&#xff1b; 什么 Wallos &#xff1f; Wallos 是一款功能强大、开源且可自我托管的网络应用程序&#xff0c;旨在让您轻松管理财务。告别复杂的电子表格和昂贵的财务软件–Wallos简化了跟踪费用的过程&#xff0c;帮助您更好地控制财务生活。 软…

neo4j下载安装最新教程 2024.02

文章目录 neo4j简介neo4j与jdk版本对应neo4j历史版本 下载地址配置环境变量命令行启动验证安装结果 neo4j简介 Neo4j 是一个高性能的 NoSQL 图形数据库&#xff0c;它将结构化数据存储在网络&#xff08;从数学角度叫做图&#xff09;上而不是表中。Neo4j 也可以被看作是一个高…

【动态规划初识】不同的二叉搜索树

每日一道算法题之不同二叉搜索树个数 一、题目描述二、思路三、C++代码一、题目描述 题目来源:LeetCode 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 C++程序要求输入输出格式如下: 示例1:…

MinIO 和 Apache Tika:文本提取模式

Tl;dr: 在这篇文章中&#xff0c;我们将使用 MinIO Bucket Notifications 和 Apache Tika 进行文档文本提取&#xff0c;这是大型语言模型训练和检索增强生成 LLM和RAG 等关键下游任务的核心。 前提 假设我想构建一个文本数据集&#xff0c;然后我可以用它来微调 LLM.为了做…

w28DVWA-csrf实例

DVWA-csrf实例 low级别 修改密码&#xff1a;修改的密码通过get请求&#xff0c;暴露在url上。 写一个简单的html文件&#xff0c;里面伪装修改密码的文字&#xff0c;代码如下&#xff1a; <html><body><a href"http://dvwa:7001/vulnerabilities/csr…

java-8组合式异步编程

11.1 Future 接口 Future接口在Java5中被引人&#xff0c;设计初衷是对将来某个时刻会发生的结果进行建模。它建模了一种异步计算&#xff0c;返回一个执行运算结果的引用&#xff0c;当运算结束后&#xff0c;这个引用被返回给调用方。在Future中触发那些潜在耗时的操作把调用…

Java微服务学习Day2

文章目录 Nacos配置管理统一配置管理配置热更新![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c8a2d17baeef411980b44b432eb9692a.png)配置共享搭建Nacos集群 Feign远程调用介绍自定义配置性能优化最佳实践 Gateway服务网关介绍搭建网关服务路由断言工厂路由过滤器…

【c++】析构函数

1.特征 析构函数是特殊的成员函数&#xff0c;其特征如下&#xff1a; 1.析构函数名是在类名前加上字符~。 2.无参数无返回值类型。 3.一个类只能有一个析构函数。若未显式定义&#xff0c;系统会自动生成默认的析构函数。注意&#xff1a;析构函数不能重载。 4.对象生命周…