Spring Boot AOP(一) 入门与核心概念

Spring Boot AOP(一) 入门与核心概念
博主社群介绍: ① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。 ② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。 ③ 群内也有职场精英,大厂大佬,跨国企业主管,可交流技术、面试、找工作的经验。 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬,进群赠送ZEEKLOG评论防封脚本,送真活跃粉丝,助你提升文章热度。 群公告里还有全网大赛约稿汇总/博客提效工具集/ZEEKLOG自动化运营脚本 有兴趣的加文末联系方式,备注自己的ZEEKLOG昵称,拉你进群,互相学习共同进步。 

文章目录

Spring Boot AOP(一) 入门与核心概念

1. AOP 基础概念

AOP(Aspect-Oriented Programming,面向切面编程)是一种用于处理 横切关注点(Cross-Cutting Concerns)的编程技术。在企业级项目中,日志记录、性能监控、事务管理、权限校验等通常会重复出现在多个模块,如果将这些逻辑直接写入业务方法,会导致代码耦合高、难维护。AOP 通过 切面(Aspect) 将这些横切逻辑模块化,从而解耦业务逻辑。

核心概念

概念说明示例
切面 Aspect横切关注点模块化封装日志切面、事务切面
通知 Advice切面中具体执行操作@Before、@After、@Around
连接点 JoinPoint可以被切面切入的位置方法调用、异常抛出
切入点 Pointcut匹配连接点的表达式execution(* com.example.service….(…))
织入 Weaving将切面应用到目标对象的过程Spring AOP 在运行时生成代理
Spring AOP 默认使用 运行时动态代理,只对 Spring 管理的 Bean 生效,无法处理普通对象的直接方法调用。

2. 连接点与切入点表达式

2.1 JoinPoint 常用方法

@Around("execution(* com.example.service..*.*(..))")publicObjectlogAround(ProceedingJoinPoint pjp)throwsThrowable{System.out.println("目标对象: "+ pjp.getTarget());System.out.println("方法签名: "+ pjp.getSignature());System.out.println("方法参数: "+Arrays.toString(pjp.getArgs()));return pjp.proceed();}
方法说明
getTarget()目标对象
getThis()当前代理对象
getArgs()方法参数
getSignature()方法签名
proceed()执行目标方法(环绕通知专用)

2.2 切入点表达式常用类型

表达式含义示例
execution()匹配方法执行execution(* com.example.service….(…))
within()匹配类或包within(com.example.service…*)
this()匹配代理对象类型this(com.example.service.MyService)
target()匹配目标对象类型target(com.example.service.MyService)
args()匹配参数类型args(String, …)

2.3 切入点示意图

匹配不匹配Service 层方法匹配切入点?执行切面通知直接执行目标方法


3. Spring AOP 通知类型

类型执行时机注解适用场景
前置通知方法执行前@Before权限校验、日志记录
后置通知方法执行后@After日志记录、资源清理
返回通知方法成功返回后@AfterReturning日志记录、返回值处理
异常通知方法抛出异常后@AfterThrowing异常记录、告警
环绕通知方法执行前后@Around性能统计、异常统一处理

通知执行顺序示意

flowchart TD A[方法调用前] --> B[@Before 前置通知] B --> C[方法执行] C -->|成功| D[@AfterReturning 返回通知] C -->|异常| E[@AfterThrowing 异常通知] F[@After 后置通知] --> G[方法调用结束] D --> F E --> F 

4. 简单切面示例

@Aspect@ComponentpublicclassLogAspect{@Before("execution(* com.example.service..*.*(..))")publicvoidlogBefore(JoinPoint joinPoint){System.out.println("前置通知: 调用方法 "+ joinPoint.getSignature().getName());}@AfterReturning(pointcut ="execution(* com.example.service..*.*(..))", returning ="result")publicvoidlogAfterReturning(JoinPoint joinPoint,Object result){System.out.println("返回通知: 方法返回值 "+ result);}@Around("execution(* com.example.service..*.*(..))")publicObjectlogAround(ProceedingJoinPoint pjp)throwsThrowable{long start =System.currentTimeMillis();System.out.println("环绕通知: 方法执行前");Object result = pjp.proceed();System.out.println("环绕通知: 方法执行后, 耗时 "+(System.currentTimeMillis()- start)+"ms");return result;}}

5. 方法调用流程示意

ClientProxyTarget调用方法执行 @Before调用目标方法返回结果执行 @AfterReturning 或 @AfterThrowing返回最终结果ClientProxyTarget


6. 环绕通知深入解析

环绕通知 (@Around) 可以完全控制目标方法的执行:

  • 可以修改参数
  • 可以捕获异常
  • 可以修改返回值
  • 可以决定是否执行目标方法
@Around("execution(* com.example.service..*.*(..))")publicObjectsecureAround(ProceedingJoinPoint pjp)throwsThrowable{Object[] args = pjp.getArgs();// 修改参数 args[0]="modified";try{Object result = pjp.proceed(args);return result;}catch(Throwable ex){System.out.println("捕获异常: "+ ex.getMessage());throw ex;}}

流程图:环绕通知控制流程

flowchart TD A[方法调用] --> B[@Around 执行前逻辑] B --> C{是否执行目标方法?} C -->|执行| D[调用目标方法] C -->|不执行| E[直接返回] D --> F[@Around 执行后逻辑] F --> G[返回给调用方] E --> G 

7. AOP 与 Bean 生命周期交互

Spring AOP 使用 BeanPostProcessor 在 Bean 初始化后生成代理:

是否BeanDefinition 注册Bean 实例化依赖注入postProcessBeforeInitialization初始化方法postProcessAfterInitialization需要代理?创建代理对象直接返回 Bean代理对象注入到容器

核心类:

  • AnnotationAwareAspectJAutoProxyCreator
  • ProxyFactory / Enhancer
  • Advisor / Advice / Pointcut

8. 实战案例:日志 + 性能切面

@Aspect@ComponentpublicclassPerformanceAspect{@Around("execution(* com.example.service..*.*(..))")publicObjectmeasureTime(ProceedingJoinPoint pjp)throwsThrowable{long start =System.currentTimeMillis();Object result = pjp.proceed();long duration =System.currentTimeMillis()- start;System.out.println(pjp.getSignature()+" 耗时: "+ duration +"ms");return result;}}@Aspect@ComponentpublicclassLoggingAspect{@Before("execution(* com.example.service..*.*(..))")publicvoidlogBefore(JoinPoint joinPoint){System.out.println("调用方法: "+ joinPoint.getSignature().getName());}@AfterReturning(pointcut ="execution(* com.example.service..*.*(..))", returning ="result")publicvoidlogAfterReturning(JoinPoint joinPoint,Object result){System.out.println("方法返回值: "+ result);}}

多切面调用顺序示意

flowchart TD A[方法调用] --> B[LoggingAspect @Before] B --> C[PerformanceAspect @Around 前] C --> D[目标方法执行] D --> E[PerformanceAspect @Around 后] E --> F[LoggingAspect @AfterReturning] F --> G[返回调用方] 

9. 本文小结

  • AOP 是处理横切关注点的强大机制
  • 切面 + 通知 + 切入点构成核心
  • 环绕通知最灵活,可控制方法执行前后
  • 多切面、Bean 生命周期、通知组合都需要清楚理解
  • Mermaid 图帮助理解调用顺序和执行流程

结束语

👨‍💻 关于我

持续学习 | 追求真我

如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。

感谢订阅专栏 三连文章

image-20251011155556997

掘金点击访问QiunerZEEKLOG点击访问QiunerGitHub点击访问QiunerGitee点击访问Qiuner

专栏简介
📊 一图读懂系列图文并茂,轻松理解复杂概念
📝 一文读懂系列深入浅出,全面解析技术要点
🌟持续更新保持学习,不断进步
🎯 人生经验经验分享,共同成长
你好,我是Qiuner. 为帮助别人少走弯路而写博客

如果本篇文章帮到了你 不妨点个吧~ 我会很高兴的 😄 (^ ~ ^) 。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。

代码都在Github或Gitee上,如有需要可以去上面自行下载。记得给我点星星哦😍

如果你遇到了问题,自己没法解决,可以去我掘金评论区问。ZEEKLOG评论区和私信消息看不完 掘金消息少一点.
上一篇推荐链接
Java程序员快又扎实的学习路线点击该处自动跳转查看哦
一文读懂 AI点击该处自动跳转查看哦
一文读懂 服务器点击该处自动跳转查看哦
2024年创作回顾点击该处自动跳转查看哦
一文读懂 ESLint配置点击该处自动跳转查看哦
老鸟如何追求快捷操作电脑点击该处自动跳转查看哦
未来会写什么文章?预告链接
一文读懂 XX?点击该处自动跳转查看哦
2025年终总结点击该处自动跳转查看哦
一图读懂 XX?点击该处自动跳转查看哦

Read more

Java 常见Exception全面解析:出现场景、错误排查与代码修正实战

Java 常见Exception全面解析:出现场景、错误排查与代码修正实战

文章目录 * 课程导言 * 适用对象 * 学习目标 * 课程安排 * 教学方式 * 第一部分:Java异常体系回顾(约10分钟) * 1.1 异常是什么? * 1.2 Java异常体系结构 * 1.3 异常信息解读 * 第二课时(上):运行时异常深度剖析(约30分钟) * 2.1 NullPointerException(空指针异常) * 现象描述 * 出现场景 * 堆栈分析示例 * 排查方法流程图 * 代码修正与预防 * 2.2 ArrayIndexOutOfBoundsException(数组下标越界异常) * 现象描述 * 出现场景 * 堆栈分析示例 * 排查方法 * 代码修正与预防 * 2.3 ClassCastException(类型转换异常) * 现象描述 * 出现场景 * 堆栈分析示例 * 排查方法 * 代码修正与预防 * 2.

By Ne0inhk

Power BI与Python结合:大数据分析新姿势

Power BI与Python结合:大数据分析新姿势 关键词:Power BI、Python、大数据分析、数据可视化、ETL、数据建模、自动化数据分析 摘要:本文深入探讨Power BI与Python在大数据分析中的深度融合技术。通过解析两者的技术架构与核心优势,揭示如何利用Python强大的数据处理、机器学习能力增强Power BI的数据清洗、特征工程、高级可视化与预测分析功能。结合具体代码案例演示数据从Python预处理到Power BI可视化的全流程,涵盖开发环境搭建、核心算法实现、实战项目部署等关键环节。最后分析典型应用场景与未来趋势,为数据分析师、BI开发者提供高效的技术融合解决方案。 1. 背景介绍 1.1 目的和范围 随着企业数据规模呈指数级增长,传统BI工具在处理非结构化数据、复杂算法集成、动态可视化等场景逐渐显现局限性。Power BI作为微软推出的主流商业智能工具,具备强大的数据连接、报表设计与交互能力,但在高级数据处理(如自然语言处理、深度学习模型嵌入)和自定义可视化方面依赖外部扩展。 Python作为数据科学领域的通用语言,拥有Pandas、Scik

By Ne0inhk

PyAutoGUI:Python 桌面自动化框架详解

一、PyAutoGUI 核心介绍 PyAutoGUI 是一款跨平台(支持 Windows、macOS、Linux)的 Python 桌面自动化库,能够模拟用户的鼠标移动、点击、滚轮操作和键盘输入,还支持屏幕截图、图像识别定位等功能,广泛用于重复性桌面操作自动化(如表单填写、软件操作、批量处理等)。 二、安装步骤 直接通过 pip 命令安装,命令简洁无复杂依赖: pip install pyautogui 补充:若安装失败(如 macOS 需额外依赖),可参考官方文档适配系统环境,Windows 系统通常可直接安装成功。 三、核心功能详解   自动获取当前鼠标位置: import pyautogui import time try: while True: x, y

By Ne0inhk

Python 学习笔记:新手必看的 31 个核心知识点速查

Python 学习笔记:新手必看的 31 个核心知识点速查 摘要:本文整理了 Python 学习过程中最常见的 31 个基础知识点,涵盖了函数定义、循环控制、数据结构操作及常用模块技巧,适合新手查漏补缺。 一、 基础语法与输入输出 1. 方法定义 Python 使用 def 定义函数,逻辑通过缩进来控制。 defxxx(a, b): a =10 b =10return a * b # 推荐:返回结果方便后续使用# print(c) # 或者直接打印(仅用于展示) 2. 获取长度 使用 len() 函数可以获取字符串、列表等容器的长度。 c =len(text) 3. 注释写法

By Ne0inhk