news 2026/8/28 14:49:10

【Spring Boot】Spring AOP 快速上手指南:开启面向切面编程新旅程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Spring Boot】Spring AOP 快速上手指南:开启面向切面编程新旅程

前言**???本期讲解关于spring aop的入门介绍~~~??感兴趣的小伙伴看一看小编主页:-CSDN博客?? 你的点赞就是小编不断更新的最大动力****??那么废话不多说直接开整吧~~**目录???1.AOP概述1.1什么是AOP?1.2什么是Spring AOP???2.Spring AOP入门2.1环境设置2.2代码编写???3.Spring AOP详细3.1Spring AOP核心概念1.切点2.连接点3.通知4.切面3.2Spring AOP通知类型3.3@pointcut注解3.4@order切面优先级???4.总结### **??**1.AOP概述#### 1.1什么是AOPAOP是Spring框架的第核(第核是IoC),说明AOP也是非常重要的;> AOP:Aspect Oriented Programming(向切编程)> > 面向切面编程:所谓的这里的切面就是表示一类特殊的问题,所以也叫面向特定方法编程;这里特定的方法,在之前学习过的spring统一功能处理中,涉及到登录校验问题,而拦截器就是对这类问题的统一求解,AOP是一种求解问题的思想,那么拦截器就是一种思想的实现;总结:>简单来说: AOP是种思想, 是对某类事情的集中处理#### 1.2什么是Spring AOPAOP是种思想, 它的实现法有很多, 有Spring AOP,也有AspectJ、CGLIB等.Spring AOP是其中的种实现式;在日常的代码编写中,有以下列子:假如,我们要对这里面的接口实现改良,让执行时间减少,这里就定位到某些业务代码逻辑等改进,但是不是所有都是不好的,所以我们需要进行测试每个接口,业务执行的时间,那么就有如下的代码,来进行时间检测:此时的方法固然是可以的,但是那么多接口都需要这样写吗??答案是不可能的,此时这就是一类特定的问题,此时我们就可以使用AOP思想来进行解决~~~> AOP就可以做到在不改动这些原始法的基础上, 针对特定的法进功能的增强. > AOP的作:在程序运期间在不修改源代码的基础上对已有法进增强(侵性: 解耦)### *??2.Spring AOP入门#### 2.1环境设置首先创建一个springboot项目,设置Maven,然后引入如下的依赖 org.springframework.boot spring-boot-starter-aop 这里还可以引入lombok来进行slf4j日志打印,但是在新版本中要将引入的lombok中一部分给注释掉,如下所示: #### 2.2代码编写具体的代码如下所示: @Slf4j @Aspect @Component //交给spring进行管理 public class TimeAspect { @Around("execution(com.example.springaop.controller..(…))") public Object timeRecord(ProceedingJoinPoint joinPoint) throws Throwable { //记录开始时间 long start = System.currentTimeMillis(); //执行目标方法 Object proceed = joinPoint.proceed(); //记录结束时间 long end = System.currentTimeMillis(); //日志打印耗时 log.info("耗时时间: “+ (end-start) + “ms”); return proceed; } }解释:> 1. @Aspect: 标识这是个切类 > 2. @Around: 环绕通知, 在标法的前后都会被执. 后的表达式表对哪些法进增强. > 3. ProceedingJoinPoint.proceed() 让原始法执那么上述代码大致分为如下:总结优势:> 代码侵: 不修改原始的业务法, 就可以对原始的业务法进了功能的增强或者是功能的改变 > 减少了重复代码 > 提开发效率 > 维护便###??3.Spring AOP详细#### 3.1Spring AOP核心概念##### 1.切点切点(Pointcut), 也称之为"切点" Pointcut 的作就是提供组规则 (使 AspectJ pointcut expression language 来描述), 告诉程序对哪些法来进功能增强如下所示: execution(com.example.springaop.controller..(…))这个就是切点表达式;##### 2.连接点满切点表达式规则的法, 就是连接点. 也就是可以被AOP控制的法,上述切点表达式中的类就是controller,说明这里面的所有方法都是AOP控制方法;解释:直白来说就是我们需要操作的解决的一类问题接口,就是受到AOP管理的;这个就是连接点;##### 3.通知通知就是具体要做的作, 指哪些重复的逻辑,也就是共性功能(最终体现为个法)如上述程序中记录业务法的耗时时间, 就是通知;具体的部分就是如下:在AOP向切编程当中, 我们把这部分重复的代码逻辑抽取出来单独定义, 这部分代码就是通知的内容.##### 4.切面切(Aspect) = 切点(Pointcut) + 通知(Advice) 通过切就能够描述当前AOP程序需要针对于哪些法, 在什么时候执什么样的操作,切面包含了通知中要执行的逻辑,以及连接点的定义#### 3.2Spring AOP通知类型Spring中AOP的通知类型有以下种: @Around: 环绕通知, 此注解标注的通知法在标法前, 后都被执 @Before: 前置通知, 此注解标注的通知法在标法前被执 @After: 后置通知, 此注解标注的通知法在标法后被执, 论是否有异常都会执 @AfterReturning: 返回后通知, 此注解标注的通知法在标法后被执, 有异常不会执 @AfterThrowing: 异常后通知, 此注解标注的通知法发异常后执那么这里主要是通过代码来进行实验;每个通知类型的代码如下所示: @Slf4j @Component @Aspect public class AspectDemo1 { @Around("execution(com.example.springaop.controller..(…))") public Object aroundTest(ProceedingJoinPoint point) throws Throwable { //通知 log.info(“Around 开始执行”); //执行目标函数 Object result = point.proceed(); //结束打印 log.info(“Around 结束执行”); return result; } @Before("execution(com.example.springaop.controller..(…))") public void beforeTest(){ log.info(“before 开始执行”); } @After("execution(com.example.springaop.controller..(…))”) public void afterTest(){ log.info(“after 开始执行”); } @AfterReturning("execution(com.example.springaop.controller..(…))") public void afterReturnTest(){ log.info(“afterReturn 开始执行”); } @AfterThrowing("execution(com.example.springaop.controller..(…))“) public void afterThrowTest(){ log.info(“afterThrow 开始执行”); } }**解释:**从上到下依次的通知类型,就是注解所表示,但是对于环绕通知中,要包含这里的连接点,即目标执行方法,以及返回类型是object;环绕通知需要调 ProceedingJoinPoint.proceed() 来让原始法执, 其他通知不需要考虑标法执;此时运行如下的测试类: @Slf4j @RestController @RequestMapping(”/test") public class AspectTest { @RequestMapping(“/t1”) public String test1(){ log.info(“这是目标方法,开始执行”); return “t1”; } @RequestMapping(“/t2”) public String test2(){ log.info(“这是目标方法,开始执行”); int a=10/0; return “t2”; } }那么此时我们先运行这里没有算数异常的代码,输出的情况如下所示:**解释:*程序正常运的情况下, @AfterThrowing 标识的通知法不会执 从上图也可以看出来, @Around 标识的通知法包含两部分, 个"前置逻辑", 个"后置逻辑".其 中"前置逻辑" 会先于 @Before 标识的通知法执, “后置逻辑” 会晚于 @After 标识的通知法执 此时运行异常代码,结果如下所示:解释:@AfterReturning 标识的通知法不会执, @AfterThrowing 标识的通知法执了 @Around 环绕通知中原始法调时有异常,通知中的环绕后的代码逻辑也不会在执了(因为 原始法调出异常了#### 3.3@pointcut注解上代码存在个问题, 就是存在量重复的切点表达式 execution(*com.example.demo.controller.*.*(…)) , Spring提供了 @PointCut 注解, 把公共的切点 表达式提取出来, 需要到时引该切点表达式即可代码如下所示: @Pointcut("execution(com.example.springaop.controller..(…))") public void pt(){} @Around(“pt()”) public Object aroundTest(ProceedingJoinPoint point) throws Throwable { //通知 log.info(“Around 开始执行”); //执行目标函数 Object result = point.proceed(); //结束打印 log.info(“Around 结束执行”); return result; }**解释:**此时就是通过@pointcut注解,对于切点表达式进行了提取,那么之后再次进行通知注解的切点表达式编写时,就可以直接使用提取的方法;这里的方法若设置为私有类,那么只能在这一个类中进行使用,但是如果其他类要使用,这里必须变成public访问限定符;代码如下所示: @Slf4j @Aspect public class AspectDemo2 { @Before(“com.example.springaop.aspect.AspectDemo1.pt()”) public void beforeTest() { log.info(“AspectDemo2 before 开始执行…”); }其中@before注解中的切点编写就是,提取方法的全限定路径+类名+方法名;#### 3.4@order切面优先级假如定义了多个切类时, 并且这些切类的多个切点都匹配到了同个标法.情况如下所示首先定义三个切面类,里面的通知方法大致如下: public class AspectDemo3 { @Before(“com.example.springaop.aspect.AspectDemo1.pt()”) public void doBefore(){ log.info(“AspectDemo3 do before…”); } @After(“com.example.springaop.aspect.AspectDemo1.pt()”) public void doAfter(){ log.info(“AspectDemo3 do after…”); } } 此时进行路由访问后,打印的日志如下所示:**解释:**存在多个切类时, 默认按照切类的类名字排序 @Before 通知:字排名靠前的先执 @After 通知:字排名靠前的后执那么此时我们可以通过@order注解实现顺序的逆转,代码如下所示: @Component @Aspect @Order(3) public class AspectDemo3 { }*解释:我们设置AspectDemo3order为3,AspectDemo4的order为2,AspectDemo5的order为1,输出的结果如下所示:通过上述程序的运结果, 得出结论: @Order 注解标识的切类, 执顺序如下: @Before 通知:数字越先执 @After 通知:数字越先执 @Order 控制切的优先级, 先执优先级较的切, 再执优先级较低的切, 最终执标法###??4.总结本期主要讲解了关于Spring AOP入门概念,以及快速入门,以及Spring AOP的代码的详细介绍:切点,连接点,通知,以及切面的概念,还有通知类型等其他注解的介绍~~~???~~~~最后希望与诸君共勉,共同进步!!!*???以上就是本期内容了, 感兴趣的话,就关注小编吧。*???期待你的关注~~~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 14:48:56

小显存跑通 MiniMax-H3 Turbo LoRA:3 组关键设置的完整指南

小显存跑通 MiniMax-H3 Turbo LoRA:3 组关键设置的完整指南 【免费下载链接】MiniMax-H3-Turbo-Lora 项目地址: https://ai.gitcode.com/hf_mirrors/larryvrh/MiniMax-H3-Turbo-Lora MiniMax-H3 Turbo LoRA 把视频立体声渲染压到 4 步快速采样,约…

作者头像 李华
网站建设 2026/8/28 14:48:53

从SQL注入到权限提升:一道CTF赛题的纵深渗透实战解析

1. 项目概述:一次竞赛复盘的技术价值 最近整理硬盘,翻到了前年带队参加全国职业院校技能大赛“网络空间安全”赛项时的一些备赛笔记和真题记录。其中,2022年的那道“试题8”让我印象尤为深刻。它不像一些单纯考察漏洞利用的题目那样直接&…

作者头像 李华
网站建设 2026/8/28 14:39:45

树莓派电容式指纹传感器HAT:原理、驱动与实战应用

树莓派的外设生态里,传感器模块一直是个热闹的领域,但指纹识别这块长期处于一个尴尬的境地:要么是USB小棒子,要么是飞线加杜邦线的一堆散件,真正做成标准HAT形态、插上就能用的产品,之前一直没人做。直到这…

作者头像 李华
网站建设 2026/8/28 14:39:14

索引(B+tree、联合唯一索引、)

文章目录前言1、索引的底层实现原理和优化1.1 B树。1.2 B树,3、什么情况下设置了索引但无法使用4、简单描述mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面…

作者头像 李华
网站建设 2026/8/28 14:38:11

从WSL到双叉臂模拟页面:一条完整的开发链路搭建指南

WSL 环境并不只是把 Linux 搬到 Windows 上。真正把它当作开发底座时,你会遇到发行版安装、网络转发、跨文件系统访问、工具链版本、插件市场、设备同步和 API 调用异常等一系列问题。这篇文章围绕一个具体的练习项目展开:在 WSL 环境下,把 D…

作者头像 李华
网站建设 2026/8/28 14:35:19

三角洲行动提示xinput1_4.dll加载失败怎么办?先修复DirectX与系统组件

《三角洲行动》启动时如果弹出“加载 xinput1_4.dll 失败”,卡住的位置通常在本机 DirectX、系统 DLL 与游戏运行组件的调用链路上。这个报错可以优先按本地组件缺失来处理,再决定要不要检查客户端文件或游戏侧状态。本文围绕这条报错说明:哪…

作者头像 李华