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

发布时间:2026/8/28 14:49:12

【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.3pointcut注解3.4order切面优先级???4.总结### **??**1.AOP概述#### 1.1什么是AOPAOP是Spring框架的第核(第核是IoC说明AOP也是非常重要的 AOPAspect 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 a10/0; return “t2”; } }那么此时我们先运行这里没有算数异常的代码输出的情况如下所示**解释*程序正常运的情况下, AfterThrowing 标识的通知法不会执 从上图也可以看出来, Around 标识的通知法包含两部分, 个前置逻辑, 个后置逻辑.其 中前置逻辑 会先于 Before 标识的通知法执, “后置逻辑” 会晚于 After 标识的通知法执 此时运行异常代码结果如下所示解释AfterReturning 标识的通知法不会执 AfterThrowing 标识的通知法执了 Around 环绕通知中原始法调时有异常通知中的环绕后的代码逻辑也不会在执了(因为 原始法调出异常了#### 3.3pointcut注解上代码存在个问题, 就是存在量重复的切点表达式 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.4order切面优先级假如定义了多个切类时, 并且这些切类的多个切点都匹配到了同个标法.情况如下所示首先定义三个切面类里面的通知方法大致如下 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为3AspectDemo4的order为2AspectDemo5的order为1输出的结果如下所示通过上述程序的运结果, 得出结论: Order 注解标识的切类, 执顺序如下: Before 通知数字越先执 After 通知数字越先执 Order 控制切的优先级, 先执优先级较的切, 再执优先级较低的切, 最终执标法###??4.总结本期主要讲解了关于Spring AOP入门概念以及快速入门以及Spring AOP的代码的详细介绍切点连接点通知以及切面的概念还有通知类型等其他注解的介绍~~~???~~~~最后希望与诸君共勉共同进步*???以上就是本期内容了 感兴趣的话就关注小编吧。*???期待你的关注~~~

相关新闻

双MCU架构应对模拟设计挑战:采样时序与地噪声隔离实践

双MCU架构应对模拟设计挑战:采样时序与地噪声隔离实践

2026/8/28 14:39:12

MCU在模拟设计里通常是被当成“脏活累活”的承担者——采集电压、跑个AD转换、算个平均值。可一旦系统里同时有高精度模拟采集和复杂的控制或通信逻辑,单颗MCU会越用越憋屈:采样时序被中断抢占、模拟地平面被数字噪声污染、工程师在“用软件过滤硬件问题…

高质量古诗词数据集构建与大模型微调实战指南

高质量古诗词数据集构建与大模型微调实战指南

2026/8/28 14:39:12

简介:在自然语言处理领域,高质量数据集是模型训练与性能提升的基石。其构建原理涉及数据清洗、结构化标注与元数据设计,旨在将原始文本转化为机器可理解的标准化知识单元。这一过程的技术价值在于,它能显著提升模型在特定领域的理…

VC++6.0字符迷宫游戏:从环境搭建到代码剖析与现代化重构

VC++6.0字符迷宫游戏:从环境搭建到代码剖析与现代化重构

2026/8/28 14:39:12

简介:游戏开发的核心在于对程序状态、输入输出和实时交互的逻辑建模,其本质原理跨越了技术工具的迭代。从经典的游戏循环(Game Loop)设计模式出发,开发者需要处理状态管理、碰撞检测和渲染优化等基础问题。这些概念在早…

frontend-slides 完整指南:把 PPTX 转换成 HTML 演示文稿的零依赖方案

frontend-slides 完整指南:把 PPTX 转换成 HTML 演示文稿的零依赖方案

2026/8/28 15:39:14

frontend-slides 完整指南:把 PPTX 转换成 HTML 演示文稿的零依赖方案 【免费下载链接】ECC The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor…

3步Docker一键启动 Open WebUI:本地 AI 对话平台的完整部署路径

3步Docker一键启动 Open WebUI:本地 AI 对话平台的完整部署路径

2026/8/28 15:39:14

3步Docker一键启动 Open WebUI:本地 AI 对话平台的完整部署路径 【免费下载链接】open-webui User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 项目地址: https://gitcode.com/GitHub_Trending/op/open-webui Open WebUI 是一个可完全离线运…

frontend-slides:零依赖生成动画HTML幻灯片,还能把PPT变成网页

frontend-slides:零依赖生成动画HTML幻灯片,还能把PPT变成网页

2026/8/28 15:39:14

frontend-slides:零依赖生成动画HTML幻灯片,还能把PPT变成网页 【免费下载链接】ECC The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cu…

铁路电子系统隔离DC-DC设计:从EN50155标准到实战选型

铁路电子系统隔离DC-DC设计:从EN50155标准到实战选型

2026/8/28 15:39:14

1. 铁路电子系统的供电难题:为什么必须用隔离DC-DC1.1 从一块板卡看整车供电环境做铁路电子的人都有过这种经历:拿一块在实验室调得好好的板卡,装到车上跑一趟试运行,回来就发现电源芯片烧了、通信偶尔断、MCU莫名其妙复位。问题不…

AI不是万能药:从工程角度看模型部署、RAG与Agent落地的真实边界

AI不是万能药:从工程角度看模型部署、RAG与Agent落地的真实边界

2026/8/28 15:39:14

先亮明结论:这句话不是反对 AI,而是反对“AI 是万能药”的营销话术。从工程视角看,AI 确实在改变一部分工作方式:代码补全、文档解析、知识库问答、批量内容生成、Agent 编排,这些都真实可用。但 AI 没有改变的东西同样…

C++函数模板在量化交易中的核心应用与性能优化实践

C++函数模板在量化交易中的核心应用与性能优化实践

2026/8/28 15:29:14

1. 从策略到代码:为什么量化交易离不开C模板如果你在量化交易这个行当里摸爬滚打过一阵子,尤其是在做高频、做市或者对延迟有极致要求的策略时,你一定会对C又爱又恨。爱的是它那无与伦比的性能和控制力,恨的是它那繁琐的语法和稍不…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/27 7:25:23

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/28 7:34:42

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

基于Claude Code的开源AI求职框架:从职位搜索到Offer的全自动化闭环

基于Claude Code的开源AI求职框架:从职位搜索到Offer的全自动化闭环

2026/8/28 0:08:32

当AI助手能够独立完成从职位匹配、简历定制到面试准备的全链路求职流程时,求职不再是一场信息战,而是一场工程化战役。框架概述:本地运行的AI求职引擎这是一个构建在Claude Code之上的开源AI求职框架,核心理念是"在工作者的机…

Godot 4 仿 agar.io:相机缩放被 max_zoom 卡死,窗口越大球越小的根因与修复

Godot 4 仿 agar.io:相机缩放被 max_zoom 卡死,窗口越大球越小的根因与修复

2026/8/28 0:08:32

1. 问题现象 在 Godot 4 仿 agar.io 的 2D 项目中,相机缩放设计为「由球组整体尺寸决定」,世界可见高度恒定,窗口只作为视口裁剪。默认小窗口 1280x720 时相机高度正常;但窗口最大化到 2940x1912 后,视角被明显拉远、…

从软件测试大赛到实战:Java+Selenium自动化测试进阶指南

从软件测试大赛到实战:Java+Selenium自动化测试进阶指南

2026/8/28 0:08:32

1. 缘起:从校园到赛场,我的软件测试之路几年前,我还是一个在校园里对着Java课本和“Hello World”程序挠头的普通学生。软件测试对我来说,只是一个在开发流程末尾、用鼠标点点按钮的模糊概念。直到我偶然在学校的公告栏上看到了“…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/28 7:35:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/28 7:34:51

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/28 7:34:35

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…