Spring AOP:什么是AOP? 为什么要用AOP?如何学习AOP?

文章目录

  • 🎆前言
  • 1.为什么要用 AOP
  • 3.如何学习去 AOP?
    • 3.1 AOP 的组成
      • 切面(Aspect)
      • 连接点(Join Point)
      • 切点(Pointcut)
      • 通知(Advice)
  • 3. Spring AOP 实现
    • 3.1 普通的方式实现 AOP
    • 3.2 通过 @annotation 切断函数实现 AOP
    • 3.3 获取增强方法相关信息

🎆前言

学习一件新知识,我们首先要先了解它的概念;AOP(Aspect Oriented Programming):面向切面编程,它是⼀种思想,它是对某⼀类事情的集中处理。比如用户登录权限的校验,没有 AOP 之前,我们在所有需要判断用户登录的页面都进行调用用户验证的方法,而有了 AOP 之后,我们只需在一处配置好 AOP 规则,需要判断用户登录页面(还要接口)全部可以实现自主的登录验证,不再需要每次调用验证登录的方法,不但解决了每次调用验证方法的问题,还降低了代码的耦合性。
通俗的说,AOP就像一张网,会对某一个过程进行筛选,通过筛选的才能进行规定的操作,不通过的则会按照不通过的规则操作。
当然 AOP 是一种思想,而 Spring AOP 是一个框架,提供了 这个思想的实现方式。

1.为什么要用 AOP

还举上方那个例子,我们在处理用户登录验证时,每次验证都需要调用处理方法,随着我们项目的功能越来越多,而这些方法又相同,这么多的方法就会在代码修改和维护上使成本变高,对于这个问题,我们的处理方案就是:对功能统一的,且使用的地方较多的功能,就考虑使用 AOP 来统一处理。

AOP 可以实现的统一处理如下:

  • 统一日志记录
  • 统一方法执行时间统计
  • 统一返回格式设置
  • 统一的异常处理
  • 事务的开启和提交等

也就是说使⽤ AOP 可以扩充多个对象的某个能⼒,所以 AOP 可以说是 OOP(Object Oriented Programming,⾯向对象编程)的补充和完善。

3.如何学习去 AOP?

Spring AOP 学习主要分为以下 3 个部分:

  1. 学习 AOP 是如何组成的?也就是学习 AOP 组成的相关概念。
  2. 学习 Spring AOP 使⽤。
  3. 学习 Spring AOP 实现原理。

3.1 AOP 的组成

切面(Aspect)

切⾯(Aspect)由切点(Pointcut)和通知(Advice)组成,它既包含了横切逻辑的定义,也包括了连接点的定义。通俗的说切面就是一个处理某个方面具体问题的类,类里包含了很多方法,这些方法就是通知、切点。

连接点(Join Point)

应⽤执行过程中能够插⼊切面的⼀个点,这个点可以是⽅法调⽤时,抛出异常时,甚⾄修改字段时。切⾯代码可以利⽤这些点插⼊到应⽤的正常流程之中,并添加新的行为。

切点(Pointcut)

切点 的作⽤就是提供⼀组规则(使⽤ AspectJ pointcut expression language 来描述)来匹配连接点,给满足规则的连接点添加通知。

通知(Advice)

切⾯也是有⽬标的 ——它必须完成的⼯作。在 AOP 术语中,切⾯的⼯作被称之为通知。
通知:程序被拦截请求触发后的具体动作。

Spring 切面类中,可以在方法上使用一下注解,去设置方法为通知方法,在满足条件后会通知本方法进行调用:

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

AOP 整个组成部分的概念如下图所示,以多个⻚⾯都要访问⽤户登录权限为例:
没有使用AOP前,我们不调用登录验证方法,他就不会对用户登录进行验证,使用AOP后,当用户要使用某个需要登陆才有的功能时,AOP 就是根据配置好的文件自动验证是否登陆。
在这里插入图片描述

3. Spring AOP 实现

3.1 普通的方式实现 AOP

使用Spring AOP 来实现⼀下 AOP 的功能,完成的⽬标是拦截所有 UserController 里面的⽅法,每次调⽤ UserController 中任意⼀个⽅法时,都执⾏相应的通知事件。

Spring AOP 的实现步骤如下:

  1. 添加 Spring AOP 框架⽀持。
<!-- springboot-aop 技术 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  1. 定义切面(创建切面类)
@Slf4j
@Component
@Aspect
public class MYAspect {@Pointcut("execution(* com.example.demo.controller.*.*(..))")public void put() {}@Before("put()")public void before() {log.error("方法被调用了");}
}
  1. 定义切点(配置拦截规则)
    写法:execution([修饰符] 返回类型 包名.类名.方法名(参数))
  • 修饰符:访问修饰符可以省略,大部分情况下省略
  • 返回类型:返回值类型、包名、类名、方法名可以使用星号 * 代表任意
  • 包名、类名:包名与类名之间一个点 代表当前包下的类,两个点代表当前包及齐子包下的类
  • 方法名(参数):参数列表可以使用两个点 表示任意个数,任意类型的参数列表
execution(* com.zzq.service.*.*(..)) // 表示com.zzq.service 包下任意类,方法名任意,参数列表任意,返回值类型任意
execution(* com.zzq.service.*..*(..)) // 表示 com.zzq.service 包及其子包下任意类,方法名任意,参数列表任意,返回值类型任意
execution(* com.zzq.service.*.*())   // 表示 com.zzq.service 包下任意类,方法名任意,要求方法不能有参数,返回值类型任意
execution(* com.zzq.service.*.delete*(..)) // 表示 com.zzq.service 包下任意类,要求方法不能有参数,返回值类型任意,方法名要求以 delete 开头 
  1. 定义通知
    @Before("put()")public void before() {log.error("方法被调用了");}

当我们调用 com.example.demo.controller 中的方法时,就会先执行通知里面的东西,再执行方法,如下图(这里为了能看的更清楚,我们用了日子打印信息)
在这里插入图片描述

3.2 通过 @annotation 切断函数实现 AOP

  1. 定义切面类
@Slf4j
@Component
@Aspect
public class MYAspect {@Pointcut("@annotation(com.example.demo.aspect.InvokeLog)")public void put() {}@Before("put()")public void before() {log.error("方法被调用了");}
}
  1. 定义切点
    切点函数扫描位置是我们下面定义注解的位置
 @Pointcut("@annotation(com.example.demo.aspect.InvokeLog)")public void put() {}
  1. 定义通知
    @Before("put()")public void before() {log.error("方法被调用了");}
  1. 实现注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface InvokeLog {
}

那个方法需要增强时,我们就在这个方法上面加上这个注解,如下图:
在这里插入图片描述
加过注解的方法,就会得到增强,也就是执行通知里面的代码,如下图:
在这里插入图片描述

3.3 获取增强方法相关信息

我们是在通知的参数列表当中添加一个参数 JoinPoint joinPoint 这个参数可以帮我们拿到被增强方法相关的数据

@Before("put()")public void before(JoinPoint joinPoint) {Object[] args = joinPoint.getArgs(); // 获取参数列表中的参数Object target = joinPoint.getTarget(); // 获取代理对象MethodSignature signature = (MethodSignature) joinPoint.getSignature(); // 获取被增强的方法签名封装的对象Method method = signature.getMethod(); // 获取被增强的方法log.error("方法被调用了");}

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

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

相关文章

Ubuntu20.04安装搜狗输入法

1、安装包下载 搜狗输入法linux-首页搜狗输入法for linux—支持全拼、简拼、模糊音、云输入、皮肤、中英混输https://shurufa.sogou.com/linux点击立即下载&#xff0c;根据自己的硬件选择deb安装包。 2、输入法安装 当第一步完成以后&#xff0c;页面会自动跳转至搜狗的安装…

【opencv】计算机视觉:实时目标追踪

目录 前言 解析 深入探究 前言 目标追踪技术对于民生、社会的发展以及国家军事能力的壮大都具有重要的意义。它不仅仅可以应用到体育赛事当中目标的捕捉&#xff0c;还可以应用到交通上&#xff0c;比如实时监测车辆是否超速等&#xff01;对于国家的军事也具有一定的意义&a…

25 Linux I2C 驱动

一、I2C简介 I2C老朋友了&#xff0c;在单片机里面也学过&#xff0c;现在再复习一下。I2C使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线)&#xff0c;另外一条是 SDA(串行数据线)&#xff0c;这两条数据线需要接上拉电阻&#xff0c;总线空闲的时候 SCL…

docker部署phpIPAM

0说明 IPAM&#xff1a;IP地址管理系统 IP地址管理(IPAM)是指的一种方法IP扫描&#xff0c;IP地址跟踪和管理与网络相关的信息的互联网协议地址空间和IPAM系统。 IPAM软件和IP的工具,管理员可以确保分配IP地址仍然是当前和足够的库存先进的IP工具和IPAM服务。 IPAM简化并自动化…

开源大模型框架llama.cpp使用C++ api开发入门

llama.cpp是一个C编写的轻量级开源类AIGC大模型框架&#xff0c;可以支持在消费级普通设备上本地部署运行大模型&#xff0c;以及作为依赖库集成的到应用程序中提供类GPT的功能。 以下基于llama.cpp的源码利用C api来开发实例demo演示加载本地模型文件并提供GPT文本生成。 项…

管理类联考——数学——汇总篇——知识点突破——代数——函数——记忆

文章目录 整体文字提炼图像绘画 考点记忆/考点汇总——按大纲 本篇思路&#xff1a;根据各方的资料&#xff0c;比如名师的资料&#xff0c;按大纲或者其他方式&#xff0c;收集/汇总考点&#xff0c;即需记忆点&#xff0c;在通过整体的记忆法&#xff0c;比如整体信息很多&am…

中国天然径流量格点数据集CNRD v1.0(1961-2018)

简介 中国天然径流量是指在中国境内自然形成的各种河流、湖泊、水库等水体中自然产生的流量。根据中国水利部的数据,中国天然径流量在年际变化和地区分布上都非常不均衡。北方地区径流量较小,南方地区则较大;而东部沿海地区的水资源较为丰富,而西北干旱地区的水资源则非常…

电源控制系统架构(PCSA)之系统控制处理器组件

目录 6.4 系统控制处理器 6.4.1 SCP组件 SCP处理器Core SCP处理器Core选择 SCP处理器核内存 系统计数器和通用计时器 看门狗 电压调节器控制 时钟控制 系统控制 信息接口 电源策略单元 传感器控制 外设访问 系统访问 6.4 系统控制处理器 系统控制处理器(SCP)是…

基于Python 中创建 Sentinel-2 RGB 合成图像

一、前言 下面的python代码将带您了解如何从原始 Sentinel-2 图像创建 RGB 合成图像的过程。 免费注册后&#xff0c;可以从 Open Access Hub 下载原始图像。 请注意&#xff0c;激活您的帐户可能需要 24 小时&#xff01; 二、准备工作 &#xff08;1&#xff09;导入必要的库…

selenium的基础语法

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️山水速疾来去易&#xff0c;襄樊镇固永难开 ☁️定位页面的元素 参数:抽象类By里…

springboot 开启和关闭kafka消费

关闭kafka自动消费 配置自定义容器工厂 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.kafka.config.C…

【从删库到跑路 | MySQL总结篇】数据库基础(增删改查的基本操作)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 重点放前面&am…

Android frameworks 开发总结之八

Quick Settings增加一項 XXX device要求在quick settings中增加一項touch panel. 在/frameworks/base/packages/SystemUI/res/values/config.xml文件中的quick_settings_tiles_default string 中增加touch panel。並在String resource文件中增加顯示的title <!-- The def…

网络数据结构skb_buff原理

skb_buff基本原理 内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体&#xff0c;而是通过增加协议头和移动指针来操作的。如果是从L4传输到L2&#xff0c;则是通过往sk_buff结构体中增加该层协议头来操作&#xff1b;如果是从L4到L2&#xff0c;则是通过移动sk_…

Kafka(五)消费者回调 +定时重试 + 理解Rebalance

文章目录 消费者回调如何抽象callBack消息&#xff1f;为什么要设置serverId?如何消费callBack消息&#xff1f; 定时重试消息失败表的设计重试逻辑设计 理解Rabalance通过日志来理解rebalance 参考资料结语示例源码仓库 消费者回调 有些邮件发送成功之后&#xff0c;需要执行…

【Linux】fork()

文章目录 一、fork()是什么&#xff1f;二、fork()干了什么&#xff1f;三、fork()怎么用&#xff1f; 一、fork()是什么&#xff1f; fork()函数其实是在Linux系统中用于创建一个新的进程。让我们看看Linux中是怎么描述的&#xff1f;运行man fork。 RETURN VALUE On success…

php站点伪静态配置(Apache+Linux)

404报错&#xff1a; 404 Not Found nginx/1.15.11 问题解决&#xff1a; 1、Linux location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s/$1 last; } } 2、Apache <IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteCond %{REQU…

英特尔和 ARM 将合作开发移动芯片技术,如何看待双方合作?

英特尔和 ARM 将合作开发移动芯片技术&#xff0c;如何看待双方合作&#xff1f; 最近市场传出Arm要自产芯片&#xff0c;供智能手机与笔电等使用后&#xff0c;外媒指Arm自产芯片将由英特尔晶圆代工部门打造&#xff0c;变成英特尔晶圆代工客户。将采用英特尔18A工艺&#xff…

利用Nginx与php处理方式不同绕过Nginx_host实现SQL注入

目录 首先需要搭建环境 nginxphpmysql环境&#xff1a; 搭建网站 FILTER_VALIDATE_EMAIL 绕过 方法1&#xff1a;冒号号分割host字段 方法2&#xff1a;冒号号分割host字段 方法3&#xff1a;SNI扩展绕过 首先需要搭建环境 nginxphpmysql环境&#xff1a; php安装包&a…

深入了解Spring Cloud中的分布式事务解决方案

引言 介绍分布式系统中事务管理的重要性&#xff0c;以及在云计算环境下分布式事务所面临的挑战。 传统事务和分布式事务 解释本地事务与分布式事务的区别&#xff0c;以及为什么在分布式环境中需要特殊的事务管理机制。 分布式事务的挑战 探讨在分布式系统中实现事务一致性所…