快速了解Spring AOP的概念及使用

文章目录

  • 1. AOP概念
    • 1.1 什么是AOP?
    • 1.2 什么是Spring AOP?
  • 2. Spring AOP的使用
    • 2.1 引入Spring AOP依赖
    • 2.2 编写AOP程序
  • 3. Spring AOP详解
    • 3.1 Spring AOP核心概念
      • 1. 切点(Pointcut)
      • 2. 连接点(Join Point)
      • 3. 通知(Advice)
      • 4. 切面(Aspect)
    • 3.2 切⾯优先级 @Order

1. AOP概念

1.1 什么是AOP?

AOP全称Aspect Oriented Programming(⾯向切⾯编程),它和面向对象编程(OOP)是不同的,OOP是一种以对象为核心的编程思想,AOP是一种以切面为核心的编程思想
切面可以特指某一特定的问题,如日志记录、事务管理、安全性和错误处理等。
而AOP通过将横切关注点从应用程序的核心逻辑中分离出来,减少了代码冗余和复杂性。简单的来说,AOP就是一种思想,对某一类事情的集中处理。

1.2 什么是Spring AOP?

AOP是一种思想,那Spring AOP就是一种实现的方式,当然不是唯一的实现方式,还有AspectJ、CGLIB等。
当要进行网站用户是否登录判断,如图:
在这里插入图片描述
如果业务模块中只有一个业务,会有人说,这不是多此一举吗?是的,是多此一举,但是一个业务模块中往往会有着许多许多的业务,那么就可以看出来AOP的强大了,大大的降低代码的耦合性,并且会很好的维护。

2. Spring AOP的使用

直接介绍概念不免略显空洞,但Spring AOP使用起来却很简单,我们可以先使用一下,然后在介绍那令人头大的概念。

2.1 引入Spring AOP依赖

在创建项目时,无法自动引入Spring AOP依赖,只能手动复制到pom.xml文件中,如果你有代码可以直接复制,没有的话,也可以从Maven仓库中复制,直接搜索找到对应版本即可。
也可以复制我的:

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

2.2 编写AOP程序

切面类UserAspect.java:

package com.example.springaopdemo.aop;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect //告诉spring切面类
@Component
@Slf4j
public class UserAspect {//切点@Pointcut("execution(* com.example.springaopdemo.controller.UserController.*(..))")public void Pointcut(){}//前置通知@Before("Pointcut()")public void BeforeAdvice(){log.info("执行了前置通知");}//后置通知@After("Pointcut()")public void AfterAdvice(){log.info("执行了后置通知");}//环绕通知@Around("Pointcut()")public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {log.info("进入环绕通知");Object object = null;object = joinPoint.proceed();log.info("退出环绕通知");return object;}
}

业务类UserController.java:

package com.example.springaopdemo.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/user")
@RestController
@Slf4j
public class UserController {@RequestMapping("/sayHi")public String sayHi(){log.info("执行了sayHi方法  ");return "hi";}@RequestMapping("/sayHello")public String sayHello(){log.info("执行了sayHello方法  ");return "hello";}
}

参考业务类ArticleController.java:

package com.example.springaopdemo.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/art")
@Slf4j
public class ArticleController {@RequestMapping("/showArt")public String showArt(){log.info("执行了showArt方法");  return "100篇";}
}

访问user/sayHi:
在这里插入图片描述
访问user/sayHello:
在这里插入图片描述
访问art/showArt:
在这里插入图片描述
上面就是Spring AOP的简单使用,可以看到访问不同接口的结果不同,为什么前两个接口又可以调用切口类中的方法呢?那些注解的作用是什么?什么又是切口类?调用顺序为什么又是这样?下面慢慢介绍。

注解:

  1. @Aspect:告诉Spring这是一个切口类。
  2. @Pointcut:定义一个切点。里面的参数后面介绍。
  3. @Before:前置通知。目标方法前执行。
  4. @After:后置通知。目标方法后执行。
  5. @Around:环绕通知。在⽬标⽅法的前后都会被执⾏. 后⾯的表达式表⽰对哪些⽅法进⾏增强。

在这里插入图片描述

3. Spring AOP详解

3.1 Spring AOP核心概念

分为四部:

  1. 切点(Pointcut)。
  2. 连接点(Join Point)。
  3. 通知(Advice)。
  4. 切面(Aspect)。

其中切面中包括切点和通知。
切点包括连接点。

1. 切点(Pointcut)

在这里插入图片描述

切点又称切入点,里面定义了一组规则,告诉程序哪些方法需要进行功能增强。
使用@Pointcut注解,注解具有切点表达式,可以匹配访问修饰符,类,方法,参数等。
execution() 是最常⽤的切点表达式, ⽤来匹配⽅法, 语法为:

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

访问修饰符可以写public,也可以省略,也可以使用 * 替代,* 表示不做限制,也可以替代包,类,方法,参数,都表示任意的意思。
但是替代参数时,只能替代一个任意参数,而 . . 可以替代任意参数。
替代包时,也只能替代一层包,而 . . 可以替代任意层包。

这样就可以分析上面这段代码了,限制任意访问修饰符(省略了),* 任意返回类型,然后com.example.springaopdemo.controller包下的UserController类中的任意方法,任意参数可以调用这个切点。
这也就是,UserController类中的接口调用时,为和会打印了那些通知日志,而ArticleController类中的接口调用时没有的原因。

2. 连接点(Join Point)

满⾜切点表达式规则的⽅法, 就是连接点。也就是可以被AOP控制的⽅法
以程序举例, 所有 com.example.springaopdemo.controller.UserController 路径下的⽅法, 都是连接点。
连接点是满足切点表达式的方法,而切点可以看作所有连接点的集合。
比如:学校中,教数学的老师们,教数学就是切点表达式,教数学的老师都是一个连接点,教数学的所有老师就构成了切点。

3. 通知(Advice)

通知就是具体要做的工作,要统一解决的问题。在连接点处执行的代码逻辑,通知分为:

  1. 前置通知(Before):连接点方法执行前执行,一般没有返回值。
  2. 后置通知(After):连接点方法执行后执行,一般没有返回值。
  3. 环绕通知(Around):可以同时在方法调用前、调用后和返回时执行。有返回值。
  4. 返回通知(AfterReturning):在方法返回时执行。
  5. 异常通知(AfterThrowing):在方法抛出异常时执行。

所以上面接口调用时,打印的日志才是那种形式。
在AOP⾯向切⾯编程当中, 我们把这部分重复的代码逻辑抽取出来单独定义, 这部分代码就是通知的内容。

4. 切面(Aspect)

切面是一个普通的Java类,它包含了一个或多个通知方法。
切面通过使用Spring AOP的代理机制来将通知方法与目标对象的方法绑定在一起。
当目标对象的方法被调用时,相关的通知方法也会被执行。
切⾯(Aspect) = 切点(Pointcut) + 通知(Advice)

3.2 切⾯优先级 @Order

当一个项目中定义了多个切面类,并且多个多个切面类的多个切入点都匹配到同一个目标方法,那么多个切面类的通知方法执行顺序是什么样的呢?
创建两个新的切面类:
UserAspect2.java:

package com.example.springaopdemo.aop;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect //告诉spring切面类
@Component
@Slf4j
public class UserAspect2 {//切点@Pointcut("execution(* com.example.springaopdemo.controller.UserController.*(..))")public void Pointcut(){}@Before("Pointcut()")public void BeforeAdvice(){log.info("执行了前置通知->UserAspect2");}@After("Pointcut()")public void AfterAdvice(){log.info("执行了后置通知->UserAspect2");}
}

UserAspect3.java:

package com.example.springaopdemo.aop;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect //告诉spring切面类
@Component
@Slf4j
public class UserAspect3 {//切点@Pointcut("execution(* com.example.springaopdemo.controller.UserController.*(..))")public void Pointcut(){}@Before("Pointcut()")public void BeforeAdvice(){log.info("执行了前置通知->UserAspect3");}@After("Pointcut()")public void AfterAdvice(){log.info("执行了后置通知->UserAspect3");}
}

调用一个接口:
在这里插入图片描述
根据结果看出,执行顺序是按照类型排序:

@Before 通知:字⺟排名靠前的先执⾏。
@After 通知:字⺟排名靠前的后执⾏。

这样有时并无法满足我们的需要,是否可以更好的控制执行顺序?
那么,就需要用到**@Order**注解。
在这里插入图片描述
再次调用刚才的接口:
在这里插入图片描述
根据结果看出,@Order 注解标识的切⾯类, 执⾏顺序如下:

@Before 通知:数字越⼩先执⾏。
@After 通知:数字越⼤先执⾏。

在这里插入图片描述

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

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

相关文章

如何运用AppLink平台中的数据连接器组件

AppLink平台组件组成 AppLink平台组件分成三个板块触发事件组件、基础组件和数据连接器 数据连接器组件里面有10个组件&#xff0c;目前也在不断新增更多的数据连接器&#xff0c;那他们在AppLink平台里的原理、触发动作以及怎么使用呢&#xff1f;接下来用MySQL和TimescaleD…

在线陪诊系统: 医疗科技的崭新前沿

在医学科技的快速发展中&#xff0c;在线陪诊系统正成为医疗服务领域的创新力量。通过结合互联网和先进的远程技术&#xff0c;这一系统为患者和医生提供了更为便捷、高效的医疗体验。本文将深入探讨在线陪诊系统的技术背后的核心代码和实现原理。 技术背后的关键代码 在线陪…

用于图像分类任务的经典神经网络综述

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

探索性因子分析流程

探索性因子分析的步骤&#xff1a; 接下来&#xff0c;通过一个案例演示因子分析&#xff08;探索性因子分析&#xff09;的各个步骤应该如何进行。 案例&#xff1a;欲探究我国不同省份铁路运输能力情况&#xff0c;收集到部分相关数据如下&#xff1a; 上传数据至SPSSAU系统…

echarts 水波图

echarts 水波图 安装 npm install echarts --save npm install echarts-liquidfill --save引入 import * as echarts from echarts; import echarts-liquidfill;html <div id"chart1" ref"chart1" class"chart1"></div>css .cha…

常见面试题-Redis 切片集群以及主节点选举机制

Redis 切片集群了解吗&#xff1f; 答&#xff1a; Redis 切片集群是目前使用比较多的方案&#xff0c;Redis 切面集群支持多个主从集群进行横向扩容&#xff0c;架构如下&#xff1a; 使用切片集群有什么好处&#xff1f; 提升 Redis 读写性能&#xff0c;之前的主从模式中&…

使用C语言库函数qsort排序注意点

目录 题目背景错误C语言代码&#xff1a;正确C语言代码&#xff1a;注意点 题目背景 高校团委组织校园歌手比赛&#xff0c;进入决赛的校园歌手有10位,歌手编号从1到10进行编号。组委会随机抽取方式产生了决赛次序为&#xff1a;3,1,9,10,2,7,5,8,4,6。比赛现场有5个评委为参赛…

【Docker项目实战】使用Docker部署Plik临时文件上传系统

【Docker实战项目】使用Docker部署Plik 临时文件上传系统 一、Plik介绍1.1 Plik简介1.2 Plik特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Plik镜像五、部署Plik临时…

PLC:200smart

PLC&#xff1a;200smart 第十章、数据类型、数据存储1、数据类型1.1、有符号数1.2、有符号数 2、传送指令 第十一章、比较指令、整数、浮点数的运算1、比较指令1、运算指令1.1、浮点数运算1.2、整数运算 第十章、数据类型、数据存储 1、数据类型 数据类型分为两大类 无符号数…

【小布_ORACLE】Part11-1--RMAN Backups笔记

Oracle的数据备份于恢复RMAN Backups 学习第11章需要掌握&#xff1a; 一.RMAN的备份类型 二.使用backup命令创建备份集 三.创建备份文件 四.备份归档日志文件 五.使用RMAN的copy命令创建镜像拷贝 文章目录 Oracle的数据备份于恢复RMAN Backups1.RMAN Backup Concepts&#x…

用了这7款html网页制作软件,你会爱上编程!

制作网页是一个复杂的过程&#xff0c;需要注意到各种细节&#xff0c;只有依靠出色的技术能力和强大的工具&#xff0c;我们才能真正达到我们的目标。幸运的是&#xff0c;有很多优秀的HTML网页设计软件可以让整个流程变得更加轻松和高效。以下就是我们经过深思熟虑和严格筛选…

Redis 的过期策略都有哪些?

思考:假如redis的key过期之后&#xff0c;会立即删除吗&#xff1f; Redis对数据设置数据的有效时间&#xff0c;数据过期以后&#xff0c;就需要将数据从内存中删除掉。可以按照不同的规则进行删除&#xff0c;这种删除规则就被称之为数据的删除策略&#xff08;数据过期策略…

i已学赋能智慧教育时代的幼儿教育

伴随“教育数字化战略行动”的深入开展,智慧教育正式成为国家战略。智慧教育延伸至家校社教育的每个阶段。当前,为适应智慧教育发展趋势,我国制定了《中国教育现代化2035》《教育部关于加强“三个课堂”应用的指导意见》《教育信息化2.0行动计划》等文件。幼儿作为智慧教育、智…

什么是高级语言、机器语言、汇编语言?什么是编译和解释?

1、高级语言 计算机程序是一种让计算机执行特定任务的方法。程序是由程序员用一种称为编程语言的特殊语言编写的。编程语言有很多种&#xff0c;例如 C、C、Java、Python 等。这些语言被称为高级语言&#xff0c;因为它们更接近人类的自然语言&#xff0c;而不是计算机能够直接…

python基础练习题库实验5

文章目录 题目1代码实验结果题目2代码实验结果题目3代码实验结果![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6058fb4b66994aed838f920f7fe75706.png)题目4代码实验结果题目总结题目1 编写一个程序,使用while循环语句和字符串格式显示以下精确输出。 例如: …

Linux命令进阶——grep管道命令在查看日志的场景中的使用 具体案例

前言 本篇博客介绍在查看日志的场景中&#xff0c;grep管道命令的使用&#xff0c;并给出了具体的案例。 以下为Linux相关的博客文章列表&#xff1a; Linux——认识Linux的目录结构 & 常用命令 & vim命令 & 权限及其控制 & 防火墙命令 & 自定义命令 &a…

2023年【广东省安全员B证第四批(项目负责人)】证考试及广东省安全员B证第四批(项目负责人)复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年广东省安全员B证第四批&#xff08;项目负责人&#xff09;证考试为正在备考广东省安全员B证第四批&#xff08;项目负责人&#xff09;操作证的学员准备的理论考试专题&#xff0c;每个月更新的广东省安全员B证…

SpringBoot——模板引擎及原理

优质博文&#xff1a;IT-BLOG-CN 一、模板引擎的思想 模板是为了将显示与数据分离&#xff0c;模板技术多种多样&#xff0c;但其本质都是将模板文件和数据通过模板引擎生成最终的HTML代码。 二、SpringBoot模板引擎 SpringBoot推荐的模板引擎是Thymeleaf语法简单&#xff0…

如何进行无代码开发?有哪些无代码开发工具和无代码软件开发平台?

无代码开发是指不写代码&#xff0c;通过可视化工具进行应用程序开发。无代码开发让非技术用户通过拖拽和选择等简单操作&#xff0c;就能快速创建应用程序。 如何学习无代码开发 随着科技的不断发展&#xff0c;新的技术和工具不断涌现&#xff0c;无代码开发就是其中一种。掌…

YOLOv5算法进阶改进(5)— 主干网络中引入SCConv | 即插即用的空间和通道维度重构卷积

前言:Hello大家好,我是小哥谈。SCConv是一种用于减少特征冗余的卷积神经网络模块。相对于其他流行的SOTA方法,SCConv可以以更低的计算成本获得更高的准确率。它通过在空间和通道维度上进行重构,从而减少了特征图中的冗余信息。这种模块的设计可以提高卷积神经网络的性能。�…