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

10分钟打造专属AI助手!ToDesk云电脑/顺网云/海马云操作DeepSeek哪家强?

10分钟打造专属AI助手!ToDesk云电脑/顺网云/海马云操作DeepSeek哪家强?

文章目录 * 一、引言 * 云计算平台概览 * ToDesk云电脑:随时随地用上高性能电脑 * 二 .云电脑初体验 * DeekSeek介绍 * 版本参数与特点 * 任务类型表现 * 1、ToDesk云电脑 * 2、顺网云电脑 * 3、海马云电脑 * 三、DeekSeek本地化实操和AIGC应用 * 1. ToDesk云电脑 * 2. 海马云电脑 * 3、顺网云电脑 * 四、结语 * 总结:云电脑如何选择? 一、引言 DeepSeek这些大模型让 AI 开发变得越来越有趣,但真要跑起来,可没那么简单! * 本地配置太麻烦:显卡不够、驱动难装、环境冲突,光是折腾这些就让人心态崩了。 * 云端性能参差不齐:选错云电脑,可能卡到爆、加载慢,还容易掉线,搞得效率直线下降。 * 成本难控:有的平台按小时计费,价格一会儿一个样,

By Ne0inhk
用 DeepSeek 打造你的超强代码助手

用 DeepSeek 打造你的超强代码助手

DeepSeek Engineer 是啥? 简单来说,DeepSeek Engineer 是一个基于命令行的智能助手。它能帮你完成这些事: * 快速读文件内容:比如你有个配置文件,直接用命令把它加载进助手,后续所有操作都可以基于这个文件。 * 自动改文件:它不仅能提建议,还可以直接生成差异表(diff),甚至自动应用修改。 * 智能代码生成:比如你让它生成代码片段,它会按照指定格式和规则直接返回。 更重要的是,这一切都是通过 DeepSeek 的强大 API 来实现的。想象一下,你有个贴身助手,不仅能听懂你的代码需求,还能直接动手帮你写! 核心功能拆解 我们先来看 DeepSeek Engineer 的几个核心能力,让你更好地理解它的强大之处。 1. 自动配置 DeepSeek 客户端 启动这个工具时,你只需要准备一个 .env 文件,里面写上你的 API Key,比如: DEEPSEEK_API_

By Ne0inhk
解锁DeepSeek潜能:Docker+Ollama打造本地大模型部署新范式

解锁DeepSeek潜能:Docker+Ollama打造本地大模型部署新范式

🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是Docker 2、什么是Ollama 二、准备工作 1、操作系统 2、镜像准备 三、安装 1、安装Docker 2、启动Ollama 3、拉取Deepseek大模型 4、启动Deepseek  一、引言 1、什么是Docker Docker:就像一个“打包好的App” 想象一下,你写了一个很棒的程序,在自己的电脑上运行得很好。但当你把它发给别人,可能会遇到各种问题: * “这个软件需要 Python 3.8,但我只有 Python 3.6!

By Ne0inhk
深挖 DeepSeek 隐藏玩法·智能炼金术2.0版本

深挖 DeepSeek 隐藏玩法·智能炼金术2.0版本

前引:屏幕前的你还在AI智能搜索框这样搜索吗?“这道题怎么写”“苹果为什么红”“怎么不被发现翘课” ,。看到此篇文章的小伙伴们!请准备好你的思维魔杖,开启【霍格沃茨模式】,看我如何更新秘密的【知识炼金术】,我们一起来解锁更加刺激的剧情!友情提醒:《《《前方高能》》》 目录 在哪使用DeepSeek 如何对提需求  隐藏玩法总结 几个高阶提示词 职场打工人 自媒体创作 电商实战 程序员开挂 非适用场地 “服务器繁忙”如何解决 (1)硅基流动平台 (2)Chatbox + API集成方案 (3)各大云平台 搭建个人知识库 前置准备 下载安装AnythingLLM 选择DeepSeek作为AI提供商 创作工作区 导入文档 编辑  编辑 小编寄语 ——————————————————————————————————————————— 在哪使用DeepSeek 我们解锁剧情前,肯定要知道在哪用DeepSeek!咯,为了照顾一些萌新朋友,它的下载方式我放在下面了,拿走不谢!  (1)

By Ne0inhk