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? 点击该处自动跳转查看哦
相关推荐
ℳ₯㎕ddzོꦿ࿐2 小时前
Spring Boot MCP(stdio)工具实现的注意事项(踩坑总结)
java·spring boot·后端
代码方舟2 小时前
Java 进阶:基于 Spring Boot 集成天远数据“人脸比对 V3”的最佳实践
java·大数据·spring boot·python
Victor3562 小时前
Hibernate(6) Hibernate支持哪些数据库?
后端
bbq粉刷匠2 小时前
Java基础语法问答
java·开发语言·python
‿hhh3 小时前
微服务智慧交通管理平台 - 项目实现(结合Qoder搭建)
java·人工智能·机器学习·微服务·架构·需求分析·规格说明书
五岳10 小时前
分库分表数据源ShardingSphereDataSource的Connection元数据误用问题分析
java·mysql·爬坑
带刺的坐椅10 小时前
迈向 MCP 集群化:Solon AI (支持 Java8+)在解决 MCP 服务可扩展性上的探索与实践
java·ai·llm·solon·mcp
凯歌的博客10 小时前
springboot项目jar包启动, 配置文件外置
chrome·spring boot