博主社群介绍: ① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。
② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。
③ 群内也有职场精英,大厂大佬,跨国企业主管,可交流技术、面试、找工作的经验。
进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬,进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。
群公告里还有全网大赛约稿汇总/博客提效工具集/CSDN自动化运营脚本 有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。
文章目录
- [Spring Boot AOP(五) 高级特性与源码实践](#Spring Boot AOP(五) 高级特性与源码实践)
-
- [1. 高级特性概述](#1. 高级特性概述)
- [2. 自定义 Pointcut](#2. 自定义 Pointcut)
-
- [Mermaid 图:自定义 Pointcut 匹配流程](#Mermaid 图:自定义 Pointcut 匹配流程)
- [3. 自定义 Advice](#3. 自定义 Advice)
- [4. 自定义 Advisor](#4. 自定义 Advisor)
-
- [Mermaid 图:自定义 Advisor 执行流程](#Mermaid 图:自定义 Advisor 执行流程)
- [5. 自动代理装配流程](#5. 自动代理装配流程)
-
- [Mermaid 图:自动代理装配流程](#Mermaid 图:自动代理装配流程)
- [6. 高级实战示例:统一限流切面](#6. 高级实战示例:统一限流切面)
-
- [Mermaid 图:限流切面执行链](#Mermaid 图:限流切面执行链)
- [7. 多 Advisor + 自动代理组合](#7. 多 Advisor + 自动代理组合)
- [8. 小结](#8. 小结)
- 结束语

Spring Boot AOP(五) 高级特性与源码实践
1. 高级特性概述
在企业项目中,除了基础的注解切面,Spring AOP 还提供以下高级特性:
- 自定义 Advisor:控制通知和切入点组合
- 自定义 Pointcut:精确匹配方法
- 自定义 Advice:实现特定逻辑,如限流、熔断、缓存
- 自动代理装配流程:Spring 自动生成代理对象,织入切面
- 多切面组合优化:控制顺序、重复切面处理
2. 自定义 Pointcut
Pointcut 决定哪些方法需要被切面处理。Spring 提供 StaticMethodMatcherPointcut 和 DynamicMethodMatcherPointcut 供开发者自定义。
java
public class MyPointcut extends StaticMethodMatcherPointcut {
@Override
public boolean matches(Method method, Class<?> targetClass) {
return method.getName().startsWith("get");
}
}
- 匹配所有以
get开头的方法 - 可以结合自定义 Advisor 使用
Mermaid 图:自定义 Pointcut 匹配流程
匹配
不匹配
扫描 Bean 方法
匹配自定义 Pointcut
应用 Advice
直接调用方法
方法执行 + 通知逻辑
3. 自定义 Advice
Advice 可以实现任意逻辑,只要实现 MethodInterceptor 接口即可。
java
public class MyAdvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("自定义通知前逻辑");
Object result = invocation.proceed();
System.out.println("自定义通知后逻辑");
return result;
}
}
- 结合自定义 Pointcut,可以形成 自定义 Advisor
- 实现灵活的业务逻辑切面,例如限流、缓存、监控
4. 自定义 Advisor
Advisor 是 切入点 + 通知的组合 。可以用 DefaultPointcutAdvisor 将自定义 Pointcut 和 Advice 绑定。
java
Pointcut pointcut = new MyPointcut();
Advice advice = new MyAdvice();
Advisor advisor = new DefaultPointcutAdvisor(pointcut, advice);
- Advisor 可以加入到
ProxyFactory生成代理对象 - 支持排序,控制执行顺序
Mermaid 图:自定义 Advisor 执行流程
匹配
不匹配
方法调用
匹配自定义 Pointcut
调用自定义 Advice
执行目标方法
返回结果
5. 自动代理装配流程
Spring 自动将切面应用到 Bean 的核心流程:
- 扫描 Bean 定义,找到带 @Aspect 的类
- 将切面解析为 Advisor 列表
- 在 Bean 初始化后,判断是否需要代理
- 使用 ProxyFactory 或 CGLIB Enhancer 创建代理
- 将代理对象替换原 Bean 注入容器
Mermaid 图:自动代理装配流程
是
否
BeanDefinition 注册
实例化 Bean
依赖注入
postProcessBeforeInitialization
初始化方法
postProcessAfterInitialization
是否匹配切面?
创建 ProxyFactory
选择代理类型 JDK/CGLIB
生成代理对象
替换原 Bean 注入容器
直接返回 Bean
6. 高级实战示例:统一限流切面
java
@Aspect
@Component
public class RateLimitAspect {
private final Map<String, AtomicInteger> counter = new ConcurrentHashMap<>();
@Around("@annotation(rateLimit)")
public Object limit(ProceedingJoinPoint pjp, RateLimit rateLimit) throws Throwable {
String key = pjp.getSignature().toShortString();
counter.putIfAbsent(key, new AtomicInteger(0));
if (counter.get(key).incrementAndGet() > rateLimit.value()) {
throw new RuntimeException("限流触发: " + 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完成 - 多切面组合执行顺序由
@Order或Ordered接口控制 - Mermaid 流程图清晰展示了自定义切面 + 自动代理 + 多通知组合执行链
- 这些高级特性在企业项目中用于 统一日志、限流、缓存、事务控制,保持代码整洁与可维护性
结束语

👨💻 关于我
持续学习 | 追求真我
如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。
感谢订阅专栏 三连文章

掘金点击访问Qiuner CSDN点击访问Qiuner GitHub点击访问Qiuner Gitee点击访问Qiuner
| 专栏 | 简介 |
|---|---|
| 📊 一图读懂系列 | 图文并茂,轻松理解复杂概念 |
| 📝 一文读懂系列 | 深入浅出,全面解析技术要点 |
| 🌟持续更新 | 保持学习,不断进步 |
| 🎯 人生经验 | 经验分享,共同成长 |
你好,我是Qiuner. 为帮助别人少走弯路而写博客
如果本篇文章帮到了你 不妨点个赞 吧~ 我会很高兴的 😄 (^ ~ ^) 。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。
代码都在Github或Gitee上,如有需要可以去上面自行下载。记得给我点星星哦😍
如果你遇到了问题,自己没法解决,可以去我掘金评论区问。CSDN评论区和私信消息看不完 掘金消息少一点.
| 上一篇推荐 | 链接 |
|---|---|
| Java程序员快又扎实的学习路线 | 点击该处自动跳转查看哦 |
| 一文读懂 AI | 点击该处自动跳转查看哦 |
| 一文读懂 服务器 | 点击该处自动跳转查看哦 |
| 2024年创作回顾 | 点击该处自动跳转查看哦 |
| 一文读懂 ESLint配置 | 点击该处自动跳转查看哦 |
| 老鸟如何追求快捷操作电脑 | 点击该处自动跳转查看哦 |
| 未来会写什么文章? | 预告链接 |
|---|---|
| 一文读懂 XX? | 点击该处自动跳转查看哦 |
| 2025年终总结 | 点击该处自动跳转查看哦 |
| 一图读懂 XX? | 点击该处自动跳转查看哦 |
