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? 点击该处自动跳转查看哦
相关推荐
lang201509285 小时前
Java EE并发工具:JSR 236详解
java·java-ee
毕设源码-朱学姐14 小时前
【开题答辩全过程】以 基于JavaWeb的网上家具商城设计与实现为例,包含答辩的问题和答案
java
C雨后彩虹15 小时前
CAS与其他并发方案的对比及面试常见问题
java·面试·cas·同步·异步·
java1234_小锋16 小时前
Java高频面试题:SpringBoot为什么要禁止循环依赖?
java·开发语言·面试
2501_9445255417 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 账户详情页面
android·java·开发语言·前端·javascript·flutter
计算机学姐17 小时前
基于SpringBoot的电影点评交流平台【协同过滤推荐算法+数据可视化统计】
java·vue.js·spring boot·spring·信息可视化·echarts·推荐算法
Filotimo_17 小时前
Tomcat的概念
java·tomcat
索荣荣17 小时前
Java Session 全面指南:原理、应用与实践(含 Spring Boot 实战)
java·spring boot·后端
Amumu1213817 小时前
Vue Router(二)
java·前端