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

复制代码
博主社群介绍: ① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。
② 热榜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 提供 StaticMethodMatcherPointcutDynamicMethodMatcherPointcut 供开发者自定义。

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 的核心流程:

  1. 扫描 Bean 定义,找到带 @Aspect 的类
  2. 将切面解析为 Advisor 列表
  3. 在 Bean 初始化后,判断是否需要代理
  4. 使用 ProxyFactoryCGLIB Enhancer 创建代理
  5. 将代理对象替换原 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 完成
  • 多切面组合执行顺序由 @OrderOrdered 接口控制
  • Mermaid 流程图清晰展示了自定义切面 + 自动代理 + 多通知组合执行链
  • 这些高级特性在企业项目中用于 统一日志、限流、缓存、事务控制,保持代码整洁与可维护性

结束语

👨‍💻 关于我

持续学习 | 追求真我

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

掘金点击访问Qiuner CSDN点击访问Qiuner GitHub点击访问Qiuner Gitee点击访问Qiuner

专栏 简介
📊 一图读懂系列 图文并茂,轻松理解复杂概念
📝 一文读懂系列 深入浅出,全面解析技术要点
🌟持续更新 保持学习,不断进步
🎯 人生经验 经验分享,共同成长

你好,我是Qiuner. 为帮助别人少走弯路而写博客

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

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

如果你遇到了问题,自己没法解决,可以去我掘金评论区问。CSDN评论区和私信消息看不完 掘金消息少一点.

上一篇推荐 链接
Java程序员快又扎实的学习路线 点击该处自动跳转查看哦
一文读懂 AI 点击该处自动跳转查看哦
一文读懂 服务器 点击该处自动跳转查看哦
2024年创作回顾 点击该处自动跳转查看哦
一文读懂 ESLint配置 点击该处自动跳转查看哦
老鸟如何追求快捷操作电脑 点击该处自动跳转查看哦
未来会写什么文章? 预告链接
一文读懂 XX? 点击该处自动跳转查看哦
2025年终总结 点击该处自动跳转查看哦
一图读懂 XX? 点击该处自动跳转查看哦
相关推荐
杨杨杨大侠9 小时前
DeepAgents 框架深度解析:从理论到实践的智能代理架构
后端·python·llm
雪人.9 小时前
Spring常见面试题(2026版30道面试题)
java·后端·spring
温暖小土9 小时前
深入理解 Spring Boot 配置加载顺序:外部化配置的艺术
java·springboot
小林rr9 小时前
深入探索 C++:现代特性、工程实践与性能优化全解
java·c++·性能优化
阿祖zu9 小时前
2025 AI 总结:技术研发的技能升维与职业路径系统重构的思考
前端·后端·ai编程
IT_陈寒9 小时前
Vite 5分钟性能优化实战:从3秒到300ms的冷启动提速技巧(附可复用配置)
前端·人工智能·后端
心在飞扬9 小时前
langchain学习总结-Embedding 学习总结
后端
羊小猪~~9 小时前
【QT】-- QT基础类
开发语言·c++·后端·stm32·单片机·qt
专注数据的痴汉9 小时前
「数据获取」全国民用运输机场吞吐量排名(2006-2024)
java·大数据·服务器·数据库·信息可视化
陈随易10 小时前
Vue-Router v5内置文件式路由,告别手写维护的恐惧
前端·后端·程序员