Spring Boot AOP(五) 高级特性与源码实践

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

文章目录


Spring Boot AOP(五) 高级特性与源码实践

1. 高级特性概述

在企业项目中,除了基础的注解切面,Spring AOP 还提供以下高级特性:

  • 自定义 Advisor:控制通知和切入点组合
  • 自定义 Pointcut:精确匹配方法
  • 自定义 Advice:实现特定逻辑,如限流、熔断、缓存
  • 自动代理装配流程:Spring 自动生成代理对象,织入切面
  • 多切面组合优化:控制顺序、重复切面处理

2. 自定义 Pointcut

Pointcut 决定哪些方法需要被切面处理。Spring 提供 StaticMethodMatcherPointcutDynamicMethodMatcherPointcut 供开发者自定义。

publicclassMyPointcutextendsStaticMethodMatcherPointcut{@Overridepublicbooleanmatches(Method method,Class<?> targetClass){return method.getName().startsWith("get");}}
  • 匹配所有以 get 开头的方法
  • 可以结合自定义 Advisor 使用

Mermaid 图:自定义 Pointcut 匹配流程

匹配

不匹配

扫描 Bean 方法

匹配自定义 Pointcut

应用 Advice

直接调用方法

方法执行 + 通知逻辑


3. 自定义 Advice

Advice 可以实现任意逻辑,只要实现 MethodInterceptor 接口即可。

publicclassMyAdviceimplementsMethodInterceptor{@OverridepublicObjectinvoke(MethodInvocation invocation)throwsThrowable{System.out.println("自定义通知前逻辑");Object result = invocation.proceed();System.out.println("自定义通知后逻辑");return result;}}
  • 结合自定义 Pointcut,可以形成 自定义 Advisor
  • 实现灵活的业务逻辑切面,例如限流、缓存、监控

4. 自定义 Advisor

Advisor 是 切入点 + 通知的组合。可以用 DefaultPointcutAdvisor 将自定义 Pointcut 和 Advice 绑定。

Pointcut pointcut =newMyPointcut();Advice advice =newMyAdvice();Advisor advisor =newDefaultPointcutAdvisor(pointcut, advice);
  • Advisor 可以加入到 ProxyFactory 生成代理对象
  • 支持排序,控制执行顺序

Mermaid 图:自定义 Advisor 执行流程

匹配

不匹配

方法调用

匹配自定义 Pointcut

调用自定义 Advice

执行目标方法

返回结果


5. 自动代理装配流程

Spring 自动将切面应用到 Bean 的核心流程:

  1. 扫描 Bean 定义,找到带 @Aspect 的类
  2. 将切面解析为 Advisor 列表
  3. 在 Bean 初始化后,判断是否需要代理
  4. 使用 ProxyFactoryCGLIB Enhancer 创建代理
  5. 将代理对象替换原 Bean 注入容器

Mermaid 图:自动代理装配流程

BeanDefinition 注册

实例化 Bean

依赖注入

postProcessBeforeInitialization

初始化方法

postProcessAfterInitialization

是否匹配切面?

创建 ProxyFactory

选择代理类型 JDK/CGLIB

生成代理对象

替换原 Bean 注入容器

直接返回 Bean


6. 高级实战示例:统一限流切面

@Aspect@ComponentpublicclassRateLimitAspect{privatefinalMap<String,AtomicInteger> counter =newConcurrentHashMap<>();@Around("@annotation(rateLimit)")publicObjectlimit(ProceedingJoinPoint pjp,RateLimit rateLimit)throwsThrowable{String key = pjp.getSignature().toShortString(); counter.putIfAbsent(key,newAtomicInteger(0));if(counter.get(key).incrementAndGet()> rateLimit.value()){thrownewRuntimeException("限流触发: "+ key);}try{return pjp.proceed();}finally{ counter.get(key).decrementAndGet();}}}
  • 利用自定义切面控制方法调用次数
  • 可以与事务、日志切面组合使用

Mermaid 图:限流切面执行链

未超限

超限

方法调用

RateLimitAspect 环绕通知前逻辑

检查调用次数

执行目标方法

抛出异常

环绕通知后逻辑

返回调用方


7. 多 Advisor + 自动代理组合

  • 自动扫描多个 @Aspect
  • 将所有 Advisor 按顺序加入 ProxyFactory
  • 调用链统一管理 MethodInterceptor,支持环绕、前置、后置、异常通知

客户端调用

LoggingAspect @Before

TransactionAspect @Around 前

RateLimitAspect @Around 前

目标方法执行

RateLimitAspect @Around 后

TransactionAspect @Around 后提交/回滚

LoggingAspect @AfterReturning

返回客户端


8. 小结

  • Spring AOP 高级特性允许 自定义 Advisor、Pointcut、Advice,实现复杂业务切面
  • 自动代理装配由 AnnotationAwareAspectJAutoProxyCreator + ProxyFactory 完成
  • 多切面组合执行顺序由 @OrderOrdered 接口控制
  • Mermaid 流程图清晰展示了自定义切面 + 自动代理 + 多通知组合执行链
  • 这些高级特性在企业项目中用于 统一日志、限流、缓存、事务控制,保持代码整洁与可维护性

结束语

👨‍💻 关于我

持续学习 | 追求真我

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

感谢订阅专栏 三连文章

image-20251011155556997

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

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

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

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

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

Read more

【前端实战】构建 Vue 全局错误处理体系,实现业务与错误的清晰解耦

【前端实战】构建 Vue 全局错误处理体系,实现业务与错误的清晰解耦

目录 【前端实战】构建 Vue 全局错误处理体系,实现业务与错误的清晰解耦 一、为什么要做全局错误处理? 1、将业务逻辑与错误处理解耦 2、为监控和埋点提供统一入口 二、Vue 中的基础全局错误处理方式 1、Vue 中全局错误处理写法 2、它会捕获哪些错误? 3、它不会捕获哪些错误? 4、errorHandler 的参数含义 三、全局错误处理的进阶设计 1、定义“可识别的业务错误” 2、在 errorHandler 中做真正的“分类处理” 3、补齐 Promise reject 的捕获能力 4、错误处理的策略化封装 四、结语         作者:watermelo37         ZEEKLOG优质创作者、华为云云享专家、阿里云专家博主、腾讯云“

By Ne0inhk

离线部署大模型Ollama+DeepSeek+Open-WebUI 完整指南

离线部署大模型Ollama+DeepSeek+Open-WebUI 完整指南 一、整体架构与核心组件 1. 架构流程图 硬件环境Ollama 运行框架模型管理DeepSeek-R1 模型第三方模型导入服务暴露命令行交互API 服务局域网访问Open-WebUI 可视化界面功能应用聊天交互本地知识库图像生成 2. 核心组件说明 组件作用核心优势Ollama本地大模型运行框架跨平台、部署简单、支持模型导入/管理/API调用DeepSeek-R1高性能开源大模型(中英文支持)多参数版本、兼顾速度与精度、支持复杂任务Open-WebUI可视化 Web 界面易用性强、支持 RAG 知识库、多模型切换 二、前置准备 1. 硬件要求(关键) DeepSeek-R1 版本模型大小建议 CPU建议内存建议显存适用场景1.5B1.1GB4核4~8G4GB轻量文本处理、快速响应7B/8B4.7G/4.9G8核16G14GB日常使用、平衡性能与硬件14B9GB12核32G26GB复杂推理、代码生成32B20GB16核64G48GB专业级高精度任务70B+43GB+32核+

By Ne0inhk
【基础算法】二分算法深度剖析:从模板到实战,二分查找与二分答案一网打尽

【基础算法】二分算法深度剖析:从模板到实战,二分查找与二分答案一网打尽

🔭 个人主页:散峰而望 《C语言:从基础到进阶》《编程工具的下载和使用》《C语言刷题》《算法竞赛从入门到获奖》《人工智能》《AI Agent》 愿为出海月,不做归山云 🎬博主简介 【基础算法】二分算法深度剖析:从模板到实战,二分查找与二分答案一网打尽 * 前言 * 前言 * 1. 二分算法 * 1.1 二分算法的相关概念 * 1.2 二分算法的探讨 * 1.3 二分算法模板 * 1.4 STL 中的二分 * 2. 二分查找 * 2.1 牛可乐和魔法封印 * 2.2 A-B 数对 * 2.3 烦恼的高考志愿 * 3. 二分答案 * 3.1

By Ne0inhk

Flutter 三方库 deepyr 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、高颜值的类型安全 daisyUI 响应式 Web 应用架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 deepyr 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、高颜值的类型安全 daisyUI 响应式 Web 应用架构 在鸿蒙(OpenHarmony)系统的分布式 Web 容器、轻量级 JS 服务或高性能 Web 控制台中,如何快速搭建一套既符合现代审美又具备强类型约束的 UI?deepyr 做为对 daisyUI 组件库的类型安全(Typesafe)封装,为鸿蒙上的 Jaspr Web 应用提供了极致流畅的开发体验。本文将带您领略其在鸿蒙生态中的美学实战。 前言 什么是 Deepyr?它是一套基于 Jaspr(下一代 Dart Web 框架)的 UI

By Ne0inhk